2011-08-29 3 views
8

Je regardais les nouvelles fonctionnalités du C++ 11 et l'une d'entre elles me rend confuse, car je n'arrive pas à trouver un moyen de l'utiliser dans Real World.Fonctions supprimées et par défaut Exemples du monde réel

Il est supprimé et fonctions par défaut, quelqu'un a-t-il des exemples concrets de son utilisation ou est-ce juste une de ces fonctionnalités qui ajoute juste un peu de sucre?

Répondre

8
struct A 
{ 
    A(const A& arg) : data(arg.data) 
    { 
    do_something_special(); 
    } 

    // by writing copy constructor, we suppress the generation of 
    // implicit default constructor A::A() 

    int data; 
}; 

void foo1() 
{ 
    A a; // does not work, since there's no default constructor 
} 

Disons que notre constructeur par défaut ne fait rien de spécial et est (plus ou moins) égale au compilateur a généré un. Nous pouvons le réparer soit par écrit notre propre constructeur par défaut (qui peut être fastidieux si notre classe a beaucoup de membres non statiques), ou en utilisant la syntaxe = default:

struct A 
{ 
    A() = default; 
    A(const A& arg) : data(arg.data) 
    { 
    do_something_special(); 
    } 

    int data; 
}; 

Suppression des fonctions est utile lorsque nous vouloir interdire l'utilisation de surcharges spécifiques ou de spécialisations de modèles, ou simplement interdire la copie (ou le déplacement) d'objets.

void foo(char c) {} 
void foo(int i) = delete; // do not allow implicit int -> char conversion 

Lorsque vous voulez interdire la copie (à savoir des objets de fil), de la manière habituelle idiomatiques est de déclarer constructeur de copie privée sans mise en œuvre (oui, ou utiliser :: noncopyable boost). Bien que cela fonctionne pour la plupart des cas, vous pouvez parfois rencontrer des erreurs de liens obscurs. Tenir compte:

struct A 
{ 
    A() = default; 

    friend void foo(); 

private: 
    A(const A&); 
}; 

void foo() 
{ 
    A a; 
    A b(a); // results in linker error in gcc 
} 

Faire A(const A&) supprimé, nous évitons les erreurs de l'éditeur de liens potentiels et faire notre intention (interdire la copie) très claire.

9

Une fonction membre spéciale déclarée par l'utilisateur n'est pas triviale. Si une classe a des fonctions membres spéciales non triviales, la classe n'est pas POD. Par conséquent, ce type est POD:

struct S { 
    S() = default; 
    S(int) { } 
}; 

mais ce type n'est pas POD:

struct S { 
    S() { } 
    S(int) { } 
}; 
+0

@Christian: Si nous avions simplement 'struct S {S (int) {}},', 'la présence de S (int)' serait supprime le constructeur par défaut implicitement déclaré. –

+0

Les règles pour POD ont été assouplies en C++ 0x/11, donc votre deuxième exemple serait également un POD en C++ 0x/11. Vous pouvez également utiliser les nouveaux traits :: is_pod pour vous vérifier avec un assertion statique par exemple. – David

+0

@David: Les règles pour POD ont en effet été assouplies, mais le second 'S' n'est toujours pas POD. Une structure POD doit être une classe triviale. Une classe triviale doit avoir un constructeur par défaut trivial. Un constructeur par défaut fourni par l'utilisateur n'est pas trivial. Le deuxième 'S' a un constructeur par défaut fourni par l'utilisateur et n'est donc pas POD. –

1

Vous utiliseriez les fonctions supprimées pour les classes où vous voulez empêcher la copie ou l'instanciation directe par exemple (à la singleton où vous voulez faire une fonction get_instance() à la place). Vous avez également froid supprimer pour empêcher certaines variations de votre constructeur.

La valeur par défaut est utile si vous souhaitez que le constructeur généré par le compilateur soit implicitement généré. Par exemple, si vous créez un constructeur d'argument personnalisé, l'argument no par défaut ne sera pas généré par le compilateur. Vous pouvez donc demander qu'il soit généré pour vous avec le mot clé par défaut.

Voir ici pour des exemples de ce qui précède

http://www2.research.att.com/~bs/C++0xFAQ.html#default

Questions connexes