Namespaces
Variants

C++ named requirements: MoveInsertable (since C++11)

From cppreference.net
C++ named requirements

Spécifie qu'un objet du type peut être construit dans un stockage non initialisé à partir d'une rvalue de ce type par un allocateur donné.

Table des matières

Exigences

Étant donné les types, valeurs et expressions suivants :

Type Définition
T un type d'objet
A un type d'allocateur
X un type de conteneur satisfaisant toutes les conditions suivantes :
  • X::value_type est identique à T .
  • X::allocator_type est identique à std:: allocator_traits < A > :: rebind_alloc < T > .
Valeur Définition
m une lvalue de type A
p un pointeur de type T*
Expression Définition
rv une expression désignant une rvalue de type T
expr std:: allocator_traits < A > :: construct ( m, p, rv )

T est MoveInsertable dans X si toutes les conditions suivantes sont satisfaites :

  • expr est bien formé.
  • Immédiatement après l'évaluation de expr , la valeur de * p est équivalente à la valeur de rv avant l'évaluation.

Notes

Si A est std:: allocator < T > , alors cela appellera le placement new , comme par :: new ( ( void * ) p ) T ( rv ) (jusqu'à C++20) std:: construct_at ( p, rv ) (depuis C++20) . Cela nécessite effectivement que T soit déplaçable constructible.

Si std:: allocator < T > ou un allocateur similaire est utilisé, une classe n'a pas besoin d'implémenter un constructeur de déplacement pour satisfaire cette exigence de type : un constructeur de copie qui prend un argument const T & peut lier des expressions rvalue. Si une classe MoveInsertable implémente un constructeur de déplacement, elle peut également mettre en œuvre les sémantiques de déplacement pour tirer parti du fait que la valeur de rv après la construction n'est pas spécifiée.

Bien qu'il soit requis qu'un construct personnalisé soit utilisé lors de la construction des éléments de std::basic_string jusqu'au C++23, toutes les implémentations n'ont utilisé que le mécanisme par défaut. Cette exigence est corrigée par P1072R10 pour correspondre à la pratique existante.

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 2177 C++11 l'évaluation de expr n'avait aucune postcondition ajoutée

Voir aussi

CopyInsertable