Pourquoi dois-type de référence, les membres de cause implicitement déclarées copie opérateur d'affectation pour être supprimé
Supprimé implicitement déclarées copie opérateur d'affectation
La implicitement déclarées ou par défaut de copie opérateur d'affectation pour la classe T est défini comme étant supprimés dans une des conditions suivantes est vraie:
T has a non-static data member that is const
T has a non-static data member of a reference type.
T has a non-static data member that cannot be copy-assigned (has deleted, inaccessible, or ambiguous copy assignment operator)
T has direct or virtual base class that cannot be copy-assigned (has deleted, inaccessible, or ambiguous move assignment operator)
T has a user-declared move constructor
T has a user-declared move assignment operator
De sorte que me dit quelles sont les causes de la suppression, mais pas le pourquoi? Quelqu'un peut-il expliquer:
T has a non-static data member of a reference type.
et si cela suffira, dans ma classe à traiter avec le supprimé de l'opérateur:
T& T:operator=(T& t){};
si j'ai un membre d'une classe de base qui est un type de référence.
Dois-je faire quoi que ce soit dans mon operator=
comme le déclarer explicitement retour *this
ou le compilateur g++) gérer cela pour moi? Dois-je faire quelque chose de spécial avec le membre de référence? Désolé pour la question de noob, mais je suis novice en C++ ayant commencé avec la gestion du langages (C# et Java).
OriginalL'auteur Luthervd | 2014-11-15
Vous devez vous connecter pour publier un commentaire.
Références sont liés à un objet lorsqu'ils sont initialisés et ne peut jamais être modifié après cela, tout le reste vous ne leur affecte l'objet auquel ils sont liés, non pas la référence elle-même.
Si un membre de référence est fixé au cours de la construction, et de ne jamais altérée. Étant donné que le but d'un opérateur d'affectation est de modifier les membres après la construction, il n'est pas logique pour générer une affectation implicite de l'opérateur lorsque l'un des membres ne peut jamais être modifié. Le compilateur refuse d'essayer de deviner ce que vous voulez faire et vous oblige à fournir votre propre opérateur d'affectation avec la sémantique que vous voulez.
Vous absolument certainement 100% besoin de
return *this;
Le seul moment où vous n'avez pas besoin d'un retour explicite en C++, c'est si votre fonction retourne
void
ou dansmain()
(où il y a un implicitereturn 0;
si vous atteignez la fin de la fonction) ou dans les cas inhabituels tels que les fonctions qui ne retournent jamais (en boucle pour toujours ou la levée d'une exception).Qu'elle dépend de la sémantique que vous attendez de la cession de votre genre à avoir.
Si vous ne voulez pas que la modification de l'objet de référence est lié à, amende, ne rien faire avec elle.
Si vous voulez l'assignation à modifier l'objet de référence est lié à, vous avez besoin de le faire.
Si vous voulez la référence à l'être re-lié à un autre objet, vous êtes hors de la chance, C++ ne permet pas que.
OriginalL'auteur Jonathan Wakely
Une référence ne peut pas être changé. L'objet référencé par la référence peut être modifié, mais la référence elle-même ne le peut pas.
Envisager
Il est rien vous pourriez peut-être faire quelque personnalisé
operator=
de mise en œuvre qui feraita1.r
reportez-vous àj
, et c'est pourquoi aucunoperator=
est créé ou devrait être créé sur votre compte.Si vous avez une situation dans laquelle il est d'accord pour
operator=
pas de changement de référence, alors vous pouvez définir votre propre.Si vous avez une situation où vous besoin
operator=
pour modifier une référence, votre classe ne devrait pas être une référence. Un pointeur peut être plus approprié.Heh. J'aurais pu dire "et c'est pourquoi la norme dit que le compilateur ne doit pas créer un
operator=
en votre nom, et sauf indication contraire dans la documentation, le compilateur respecte la norme", mais je pense que c'est inutilement verbeux. 🙂Exactement. Vous pourriez avoir arrêté à "c'est ce que dit la norme".
J'ai reformulé de façon à ne pas mentionner le compilateur. Je ne pense pas que votre suggestion est assez bon: si le standard dit pas
operator=
devrait être créé, et un réalisateur se sent le standard est juste ridicule, un fournisseur peut fournir unoperator=
comme une extension, longtemps que c'est sûr que ce n'est pas gâcher SFINAE. Ce n'est pas uniquement sur le standard.Une copie de cession de surcharge de
operator=
est toujours, a déclaré, que ce soit implicitement ou explicitement. Il peut ou peut ne pas être défini comme étant supprimés.OriginalL'auteur