Requisitos denominados de C++: ConstruiblePorMovimiento (desde C++11)
De cppreference.com
Especifica que un ejemplar del tipo puede construirse a partir de un argumento r-valor.
Requisitos
El tipo T satisface ConstruiblePorMovimiento si dados:
rv, una expresión r-valor de tipoT, yu, un identificador arbitrario.
Las siguientes expresiones deben ser válidas y tener sus efectos especificados.
| Expresión | Poscondiciones |
|---|---|
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 constructor de movimiento para satisfacer este requerimiento de tipo: un constructor de copia que toma un argumento const T& puede vincularse a expresiones r-valor.
Si una clase ConstruiblePorMovimiento implementa un constructor de movimiento, también puede implementar la semántica de movimiento para tomar ventaja del hecho de que el valor de rv después de la construcción no está especificado.
| Contenido extendido |
|---|
|
Ser una clase ConstruiblePorMovimiento implica std::is_move_constructible pero no al revés, ya que std::is_move_constructible solo comprobará la capacidad de llamar al constructor con los argumentos correctos, no un valor de poscondición. Ejecuta este código #include <iostream> struct S { int n; S(int in) : n{in} {} S(S&& otro) { n = otro.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 un requisito de ConstruiblePorMovimiento // 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 |
|---|
|