Maison >développement back-end >C++ >L'affectation automatique des mouvements est-elle possible avec les paramètres de référence Rvalue dans C 11 ?

L'affectation automatique des mouvements est-elle possible avec les paramètres de référence Rvalue dans C 11 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-10 13:52:02728parcourir

Is Self Move Assignment Possible with Rvalue Reference Parameters in C  11?

Assignation automatique des déplacements et bibliothèque standard

En C 11, la bibliothèque standard offre certaines garanties concernant l'affectation automatique des déplacements. Selon la norme, si un argument de fonction est lié à un paramètre de référence rvalue, l'implémentation peut supposer que le paramètre est une référence unique à cet argument.

Considérez la fonction suivante :

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}

Puisque l'argument vectoriel est lié à un paramètre de référence rvalue, l'implémentation de std::vector::operator=(vector&& other) peut supposer que other est un valeur. Par conséquent, l'auto-affectation n'est pas possible pour v dans la fonction selfAssign.

La norme dicte qu'un paramètre de référence rvalue peut être supposé être une valeur pr, excluant ainsi la possibilité d'une auto-affectation dans de tels cas. Il est probable que le vecteur transmis à la fonction selfAssign sera laissé dans un état sans ressources ou subira une non-opération s'il a déjà 0 capacité.

Cependant, la dernière version de travail de la norme, N4618 , modifie légèrement ces exigences. Plus précisément, il indique que, si t et rv ne font pas référence au même objet, alors après l'affectation « t = rv », il se peut que t n'ait besoin que de contenir la valeur équivalente de rv avant l'affectation. Quoi qu'il en soit, l'état du rv reste indéterminé après l'affectation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn