Me gustaría devolver un objeto no copiable del tipo Foo
desde una función. Esto es básicamente un objeto auxiliar que el llamante utilizará para realizar un conjunto de acciones, con un destructor para realizar una limpieza después de que se completen las acciones.¿Es malo proporcionar solo un constructor de movimiento?
Antes de la llegada de rvalue references, habría devuelto shared_ptr<Foo>
o algo similar. Con las referencias de rvalue, otra opción sería hacer que el constructor y el constructor de copias sean privados, y tener el único constructor público como un constructor de movimientos. Foo
sería algo como esto:
class Foo : boost::noncopyable
{
private:
Foo(/* whatever the real ctor needs */);
public:
Foo(Foo && src);
// ... interesting stuff ...
};
Foo a(SomethingThatReturnsFoo()); // allowed
Foo b; // error, no public default constructor
Foo c(a); // error, noncopyable
Foo d = a; // error, noncopyable
Mi pregunta es si sería mala forma de hacer esto, o si parece razonable. No puedo pensar en ninguna razón por la cual esto podría causar problemas o ser difícil de leer, pero todavía soy un novato cuando se trata de referencias de valores, por lo que podría haber consideraciones en las que no estoy pensando.
Comentario menor: si proporciona un 'Move Constructor', la gente probablemente esperará también' Move Movement Operator'. ¿Planeas proporcionarlo o quieres una clase inmutable? –
En este caso particular, está destinado a ser inmutable, por lo que no quiero asignación, pero ese es un buen punto en general. – Charlie
Por cierto, con los cambios recientes en el departamento de operaciones de copia/movimiento generado por el compilador, en realidad ya no necesita derivarse de boost :: noncopyable. Declarar un constructor de movimiento ya evitará que el compilador genere otras operaciones de copia/movimiento, consulte http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze