Maison  >  Article  >  développement back-end  >  Pourquoi l'affectation automatique n'est-elle pas autorisée pour les conteneurs de bibliothèque standard dans C 11 ?

Pourquoi l'affectation automatique n'est-elle pas autorisée pour les conteneurs de bibliothèque standard dans C 11 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-16 02:49:03352parcourir

Why is Self Move Assignment Not Allowed for Standard Library Containers in C  11?

Assignation d'auto-déplacement dans les conteneurs de bibliothèque standard

La norme C 11 garantit que l'affectation d'auto-déplacement (affectation d'un objet à lui-même après son exécution) été déplacé) n'est pas possible pour les conteneurs de bibliothèque standard comme std::vector.

La disposition spécifique de la norme se trouve dans [res.on.arguments], qui stipule que les arguments de fonction liés aux références rvalue sont considérés comme des références uniques à leur argument lié. Cela signifie que l'implémentation peut supposer que l'argument ne fait pas référence au même objet que la cible de l'affectation.

Dans le cas de std::vector, l'opérateur d'affectation de déplacement (operator=) est défini pour prenez une référence rvalue. Par conséquent, lorsque selfAssign() est appelé avec un argument std::vector, la norme permet à l'implémentation de supposer que l'argument est une référence unique à un objet temporaire. Par conséquent, l'affectation de déplacement automatique n'est pas possible et le std::vector sera laissé dans un état sans ressource (capacité 0).

Cependant, il est important de noter que ce comportement n'est garanti que pour conteneurs de bibliothèque standard. Pour les types définis par l'utilisateur, la norme C 11 ne fournit aucune garantie concernant l'affectation automatique des déplacements.

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