c++ move

c++ - ¿Cómo devuelvo un objeto no movible(pero copiable)?



move (1)

Edición: objetivo final: quiero crear una clase contenedora que nunca use movimiento, incluso cuando esté disponible. NonMove es una clase de objetos de prueba para ese contenedor.

Probé diferentes variaciones, pero GCC insiste en querer usar mover.

class NonMove { public: NonMove() {} // Copy. NonMove(const NonMove&) {} NonMove& operator=(const NonMove&) {} // Move NonMove(NonMove&&) = delete; NonMove& operator=(NonMove&&) = delete; }; NonMove foo() { return NonMove(); }

Error con GCC 4.9.1 con -std = gnu ++ 11

move.cc: In function ‘NonMove foo()’: move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’ return NonMove(); ^ move.cc:10:3: note: declared here NonMove(NonMove&&) = delete; ^


Objetivo final: quiero crear una clase contenedora que nunca use [mover], incluso cuando esté disponible. NonMove es una clase de objetos de prueba para ese contenedor.

Su clase no necesariamente ayuda a lograr su objetivo, porque eliminar el constructor de movimientos significa que el tipo no es CopyConstructible, por lo que no se puede usar para probar con precisión un contenedor que solo copia.

Para evitar que se mueva, puede asegurarse de que todas las posibles copias o movimientos se realicen con un objeto fuente constante:

NonMove foo() { return const_cast<const NonMove&&>(NonMove()); }

El constructor de movimientos no es viable si el RHS es const .

Por lo general, es suficiente solo para garantizar que el RHS sea un valor l, ya que tampoco se moverá, pero hay un caso especial para los valores de retorno de la función, que se pueden mover incluso si son valores l, lo que significa que intentaría utilizar el movimiento. constructor si existe:

NonMove foo() { NonMove nm; return nm; }

Agregar const asegura que se copiará en su lugar:

NonMove foo() { NonMove nm; return const_cast<const NonMove&>(nm); }