2016-11-15 2 views
0

Pour désactiver constructeur de copie et opérateur d'affectation, il est clair que nous pourrions faire non plus, puisque C++ 11:mis constructeur de copie désactivé en privé

class A { 
public: 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
} 

ou 03 C++:

class A { 
private: 
    A(const A&); 
    A& operator=(const A&); 
} 
cependant,

ce qui se passe avec ceci:

class A { 
private: 
    A(const A&) = delete; 
    A& operator=(const A&) = delete; 
} 

Je suppose que cela conduit aussi au même résultat. Y a-t-il un effet secondaire?

+1

Pourquoi ne l'essayez-vous pas, et voyez ce qui se passe. –

+0

Copie possible de [syntaxe C++: par défaut et suppression des modificateurs] (http://stackoverflow.com/q/16770492/636019) et/ou [Avec les fonctions membres explicitement supprimées dans C++ 11, est-il toujours intéressant d'hériter de une classe de base non oculable?] (http://stackoverflow.com/q/9458741/636019) – ildjarn

+0

J'ai essayé. tous les trois travaillent de la même manière. – pepero

Répondre

4

L'accès auquel vous donnez une fonction supprimée n'a pas d'importance - il n'existe tout simplement pas (¹), il est donc inaccessible quel que soit l'appelant.

Les messages d'erreur peuvent être légèrement plus confus. Voir par exemple http:://cpp.sh/9hv7y où la première erreur concerne "privé" plutôt que "supprimé".


¹ "ça n'existe pas" est une simplification. Il existe dans le sens où il participe à la résolution de surcharge, mais c'est une erreur si c'est la fonction sélectionnée. Donc

struct only_double { 
    only_double(intmax_t) = delete; 
    only_double(double arg); 
}; 
only_double zero(0); // Error - deleted constructor called 
+0

ouais, la fonction de suppression n'existe pas réellement, donc l'accesseur n'a pas d'importance. cela explique. Merci! – pepero

+0

Je ne pense pas qu'il soit correct de dire que _il n'existe pas_. Notez que - _La règle de définition unique s'applique aux définitions supprimées_. Voir [ici] (http://eel.is/c++draft/dcl.fct.def.delete#4) pour plus de détails. – skypjack

+0

@skypjack: Oui. C'était vrai dans le contexte de la question, mais j'ai ajouté une note de bas de page (qui finit plus longtemps que la vraie réponse!) –