2017-04-13 2 views
3

a fait un test simple et a constaté que, "= défaut" ne fonctionne que pour les fonctions membres spéciales, comme ceci:C++ 11: Quand devons-nous spécialiser "= default" pour la fonction de membre par défaut?

#include<cstdio> 
#include<utility> 
struct Base{ 
    Base(int){printf("Base(int)\n");} 
}; 
struct Derived{ 
    Derived(int)=default; 
}; 
int main(){ 
    Derived d(0); 
    return 0; 
} 

clang fera rapport erreur de compilation:

error: only special member functions may be defaulted 

Donc, si seulement « membre spécial function "est autorisé, ce" = default "semble inutile: parce que si je ne donne pas de définition de fonctions membres spéciales dans" Derived ", le compilateur en générera un pour moi, égal à" = default ".

Alors, ma question est: pourquoi et quand avons-nous besoin de "= default"?

Répondre

4

because if I don't give definition of special member functions in "Derived", compiler will generate one for me, equal to using "=default".

Lorsque vous déclarez un constructeur de copie, le constructeur de déplacement ne sera pas généré, alors les requêtes de déplacement seront traitées par le constructeur de copie. L'ajout d'un constructeur de déplacement (par défaut) peut empêcher cela:

struct Derived { 
    Derived(const Derived&) { ... } 
    Derived(Derived&&) = default; 
}; 
7

if I don't give definition of special member functions in "Derived", compiler will generate one for me, equal to using "=default".

Non, en fait.

Déclarez n'importe quel constructeur - et le constructeur par défaut fourni par le compilateur disparaîtra. Pour le ramener (sous sa forme fournie par le compilateur), vous pouvez le définir comme = default.

Fournissez un destructeur déclaré par l'utilisateur - et le constructeur de déplacement fourni par le compilateur et l'opérateur d'affectation de mouvement disparaîtront. Pour les ramener, vous pouvez les définir comme = default.

Fournit un opérateur d'affectation de mouvement déclaré par l'utilisateur - et le constructeur de copie fourni par le compilateur et l'opérateur d'affectation de copie disparaissent. Eh bien, vous avez l'idée.

= default est utilisé lorsque vous avez besoin de ramener la fonctionnalité de fonction membre spéciale fournie par le compilateur dans des situations, lorsque d'autres circonstances ont provoqué la disparition de cette fonction. Parce qu'il y a des cas où certaines des fonctions membres spéciales ne seront pas générées, par exemple,