C++ named requirements: MoveConstructible (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Especifica que una instancia del tipo puede ser construida a partir de un argumento rvalue .
Contenidos |
Requisitos
El tipo
T
satisface
MoveConstructible
si
Dado
-
rv, una expresión rvalue de tipoT, -
u, un identificador arbitrario.
Las siguientes expresiones deben ser válidas y tener sus efectos especificados.
| Expresión | Postcondiciones |
|---|---|
| T u = rv ; |
El valor de
u
es equivalente al valor de
rv
antes de la inicialización.
El nuevo valor de
|
| T ( rv ) |
El valor de
T(rv)
es equivalente al valor de
rv
antes de la inicialización.
El nuevo valor de
|
Notas
Una clase no tiene que implementar un
move constructor
para satisfacer este requisito de tipo: un
copy constructor
que toma un argumento
const T&
puede enlazar expresiones rvalue.
Si una clase
MoveConstructible
implementa un constructor de movimiento, también puede implementar
semánticas de movimiento
para aprovechar el hecho de que el valor de
rv
después de la construcción no está especificado.
| Contenido extendido |
|---|
|
Ser una clase MoveConstructible implica std::is_move_constructible pero no viceversa, ya que std::is_move_constructible solo verificará la capacidad de llamar al constructor con los argumentos correctos, no un valor de postcondición.
Ejecutar este código
#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 clase `S` no satisface el requisito MoveConstructible // El valor de `u` NO es equivalente al valor de `v` antes de la inicialización de `u` std::cout << "u.n = " << u.n << '\n'; } Salida: v.n = 1 u.n = 2 |
Referencias
| Contenido extendido |
|---|
|
Véase también
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo puede ser construido desde una referencia a valor temporal
(plantilla de clase) |
|
(C++20)
|
especifica que un objeto de un tipo puede ser construido por movimiento
(concepto) |