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 :
- allocator_traits::propagate_on_container_move_assignment::value == true
- Tous les éléments du vecteur de destination (*this) sont détruits.
- La capacité est libérée à l'aide de l'allocateur de *this.
- Les allocateurs et la propriété du tampon mémoire sont transférés de v vers *this.
- *ceci est généralement vide avant l'affectation de déplacement.
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 :
- allocator_traits::propagate_on_container_move_assignment ::value == false et get_allocator() != v.get_allocator()
- Les allocateurs ne peuvent pas être déplacés et les ressources ne peuvent pas être transférées de v à *this.
- La seule façon de mettre en œuvre l'affectation de déplacement consiste à déplacer chaque T individuellement de v à *this à l'aide de l'opération d'affectation.
- Cela nécessite que T soit MoveAssignable ou MoveInsertable (en fonction de la disponibilité de la capacité et de la taille dans *this).
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!
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