Namespaces
Variants

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

From cppreference.net
C++ named requirements

Spécifie qu'une instance du type peut être construite à partir d'un rvalue argument.

Table des matières

Exigences

Le type T satisfait MoveConstructible si

Étant donné

  • rv , une expression rvalue de type T ,
  • u , un identifiant arbitraire.

Les expressions suivantes doivent être valides et avoir leurs effets spécifiés.

Expression Post-conditions
T u = rv ; La valeur de u est équivalente à la valeur de rv avant l'initialisation.

La nouvelle valeur de rv n'est pas spécifiée.

T ( rv ) La valeur de T(rv) est équivalente à la valeur de rv avant l'initialisation.

La nouvelle valeur de rv n'est pas spécifiée.

Notes

Une classe n'a pas besoin d'implémenter un move constructor pour satisfaire cette exigence de type : un copy constructor qui prend un argument const T& peut lier des expressions rvalue.

Si une classe MoveConstructible implémente un constructeur de déplacement, elle peut également implémenter la sémantique de déplacement pour tirer parti du fait que la valeur de rv après la construction n'est pas spécifiée.

Contenu étendu

Être une classe MoveConstructible implique std::is_move_constructible mais pas l'inverse, car std::is_move_constructible vérifie uniquement la capacité d'appeler le constructeur avec les arguments corrects, pas une valeur post-condition.

#include <iostream>
struct S
{
    int n;
    S(int in) : n{in} {}
    S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
    S v{1};
    std::cout << "v.n = " << v.n << '\n';
    S u = std::move(v);
    // La classe `S` ne satisfait pas à l'exigence MoveConstructible
    // La valeur de `u` N'EST PAS équivalente à la valeur de `v` avant l'initialisation de `u`
    std::cout << "u.n = " << u.n << '\n';
}

Sortie :

v.n = 1
u.n = 2

Références

Contenu étendu
  • Norme C++23 (ISO/CEI 14882:2024) :
  • 16.4.4.2 Exigences des arguments de template [utility.arg.requirements]

Voir aussi

vérifie si un type peut être construit à partir d'une référence rvalue
(modèle de classe)
spécifie qu'un objet d'un type peut être construit par déplacement
(concept)