Maison > développement back-end > C++ > Un « std :: vector » déplacé depuis est-il garanti d'être vide ?

Un « std :: vector » déplacé depuis est-il garanti d'être vide ?

Susan Sarandon
Libérer: 2024-11-18 03:04:02
original
317 Les gens l'ont consulté

 Is a Moved-From `std::vector` Guaranteed to Be Empty?

Un vecteur déplacé depuis est-il garanti d'être vide ?

En général, la norme C fournit des indications minimales sur l'état des objets après ils ont été déplacés. Comme indiqué dans N3485 17.6.5.15 [lib.types.movedfrom]/1 :

Les objets des types définis dans la bibliothèque standard C peuvent être déplacés depuis (12.8). Les opérations de déplacement peuvent être explicitement spécifiées ou implicitement générées. Sauf indication contraire, ces objets déplacés doivent être placés dans un état valide mais non spécifié.

Bien que cette disposition n'exclue pas le vecteur d'être soumis à ce comportement, elle laisse place à l'interprétation.

Comportement spécifique du vecteur

Il n'existe aucune exigence standard explicite qui exclut le vecteur d'être affecté par la règle générale pour les objets déplacés. Cependant, compte tenu des exigences de mise en œuvre du vecteur, les options sont limitées :

Constructeur de déplacement :

  • Le constructeur de déplacement doit avoir une complexité constante.
  • La seule option est de voler les ressources du vecteur source (v) pour construire le nouveau vecteur, en laissant v vide.

Opérateur d'affectation de déplacement :

  • Le comportement dépend de l'allocateur du vecteur :

Premier cas :

Cas deux :

  • allocator_traits< A>::propagate_on_container_move_assignment::value == false et get_allocator() == v.get_allocator()
  • Comportement similaire au premier cas, mais les allocateurs ne sont pas déplacés.
  • La décision entre le cas Le cas deux et le cas trois sont créés au moment de l'exécution, ce qui a un impact sur les exigences sur T.

Cas trois :

Conclusion :

Pour le constructeur de déplacement du vecteur, le vecteur déplacé depuis est toujours vide. Pour l'opérateur d'affectation de déplacement, le vecteur déplacé depuis est généralement vide, mais peut ne pas l'être dans certains scénarios spécifiques où les allocateurs ne sont pas compatibles et où T est MoveAssignable ou MoveInsertable.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal