c++ c++11 move-semantics

c++ - ¿Cómo puede un tipo con construcción/asignación de movimiento suprimido ser considerado móvil?



c++11 move-semantics (1)

significa que el compilador no puede definir implícitamente la función de mover constructor y asignación de movimiento

Sí, eso es correcto.

y por lo tanto la operación de movimiento no está permitida.

No, las operaciones de movimiento aún se pueden realizar a través del constructor de copia y el operador de asignación de copia (aunque puede que este no sea el caso que esperaba), ya que un valor de valor siempre podría estar vinculado a const& .

Más precisamente, la clase copyable sigue siendo MoveConstructible y MoveAssignable .

Una clase no tiene que implementar un constructor de movimiento para satisfacer este requisito de tipo: un constructor de copia que toma una constante T y argumento puede vincular expresiones de valor.

Si una clase MoveConstructible implementa un constructor de movimiento, también puede implementar la semántica de movimiento para aprovechar el hecho de que el valor de rv después de la construcción no está especificado.

y

El tipo no tiene que implementar el operador de asignación de movimiento para satisfacer este requisito de tipo: un operador de asignación de copia que toma su parámetro por valor o como un Tipo constante &, se vinculará al argumento de valor de r.

Si una clase MoveAssignable implementa un operador de asignación de movimiento, también puede implementar la semántica de movimiento para aprovechar el hecho de que el valor de rv después de la asignación no está especificado.

Como señaló @Curious, puede declarar el constructor de movimiento y delete operador de asignación explícitamente para hacer que no se copyable ; luego, al usar con una expresión de valor, se seleccionará la sobrecarga delete y la compilación fallará.

struct copyable { // and movable copyable() = default; copyable(copyable const&) { /*...*/ }; copyable& operator=(copyable const&) { /*...*/ return *this; } };

Dado que las funciones de construcción de copia y operación de asignación de copia están definidas explícitamente, significa que el compilador no puede definir implícitamente la función de construcción de movimiento y asignación de movimiento y, por lo tanto, la operación de movimiento no está permitida.

¿Puede por favor hacerme saber si mi comprensión anterior es correcta?