C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 typeT, -
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
|
| T ( rv ) |
La valeur de
T(rv)
est équivalente à la valeur de
rv
avant l'initialisation.
La nouvelle valeur de
|
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.
Exécuter ce code
#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 |
|---|
|
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type peut être construit à partir d'une référence rvalue
(modèle de classe) |
|
(C++20)
|
spécifie qu'un objet d'un type peut être construit par déplacement
(concept) |