Je suis un simple programmeur. Les variables de mes membres de classe se composent le plus souvent de types POD et de conteneurs STL. Pour cette raison, je dois rarement écrire des opérateurs d'affectation ou copier des constructeurs, car ils sont implémentés par défaut.
Ajoutez à cela, si j'utilise std::move
sur des objets non mobiles, il utilise l'opérateur d'affectation, ce qui signifie qu'il std::move
est parfaitement sûr.
Comme je suis un simple programmeur, j'aimerais profiter des capacités de déplacement sans ajouter un constructeur de déplacement / opérateur d'assignation à chaque classe que j'écris, car le compilateur pourrait simplement les implémenter comme " this->member1_ = std::move(other.member1_);...
"
Mais ce n'est pas le cas (du moins pas dans Visual 2010), y a-t-il une raison particulière à cela?
Plus important; y a-t-il un moyen de contourner cela?
Mise à jour: Si vous regardez la réponse de GManNickG, il fournit une excellente macro pour cela. Et si vous ne le saviez pas, si vous implémentez la sémantique de déplacement, vous pouvez supprimer la fonction membre d'échange.
la source
MyClass::MyClass(Myclass &&) = default;
?Réponses:
La génération implicite de constructeurs de déplacement et d'opérateurs d'affectation a été controversée et il y a eu des révisions majeures dans les versions récentes de la norme C ++, de sorte que les compilateurs actuellement disponibles se comporteront probablement différemment en ce qui concerne la génération implicite.
Pour en savoir plus sur l'historique du problème, consultez la liste des articles du WG21 2010 et recherchez "mov"
La spécification actuelle (N3225, à partir de novembre) stipule (N3225 12.8 / 8):
Il existe un langage similaire dans 12.8 / 22 spécifiant quand l'opérateur d'assignation de déplacement est implicitement déclaré comme étant par défaut. Vous pouvez trouver la liste complète des modifications apportées pour prendre en charge la spécification actuelle de la génération de mouvements implicites dans N3203: resserrer les conditions de génération de mouvements implicites , qui était largement basée sur l'une des résolutions proposées par l'article de Bjarne Stroustrup N3201: Moving right along .
la source
cannot be defaulted *in the class body*
. Donc, j'ai défini le destructeur à l'extérieur et cela a fonctionné :). Je trouve cela un peu étrange, cependant. Est-ce que quelqu'un a une explication? Le compilateur est gcc 4.6.1virtual ~D() = default;
devrait fonctionner tout en autorisant un constructeur de déplacement implicite.Les constructeurs de déplacement générés implicitement ont été pris en compte pour la norme, mais peuvent être dangereux. Voir l' analyse de Dave Abrahams .
En fin de compte, cependant, la norme incluait la génération implicite de constructeurs de déplacement et d'opérateurs d'affectation de déplacement, bien qu'avec une liste assez importante de limitations:
Ce n'est pas tout à fait tout ce qu'il y a dans l'histoire. Un ctor peut être déclaré, mais toujours défini comme supprimé:
la source
Tweak2
. Je suppose que cela a quelque chose à voir avec le fait que leNumber
serait déplacé et levector
serait copié ... mais je ne suis pas sûr: / Je comprends que le problème se répercuterait en cascadeTweak3
.Ouais, j'ai aussi emprunté cette voie. Voici votre macro:
(J'ai supprimé les vrais commentaires, qui sont longs et documentaires.)
Vous spécifiez les bases et / ou les membres de votre classe sous forme de liste de préprocesseurs, par exemple:
Et en sort un constructeur de mouvement et un opérateur d'affectation de mouvement.
(En passant, si quelqu'un sait comment je pourrais combiner les détails en une seule macro, ce serait super.)
la source
VS2010 ne le fait pas car ils n'étaient pas standard au moment de la mise en œuvre.
la source