2010-09-06 10 views
7

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.

+0

Comentario menor: si proporciona un 'Move Constructor', la gente probablemente esperará también' Move Movement Operator'. ¿Planeas proporcionarlo o quieres una clase inmutable? –

+0

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

+0

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

Respuesta

9

Esto no es malo en absoluto: considere objetos como mutexes u objetos de ámbito como unique_ptr. Unique_ptr es movible pero no se puede copiar y es parte de STL.

+0

Incluso agregaría que es * muy buena forma *. Creo sinceramente que los objetos copiables deberían ser la * excepción *, no la regla. Cuanto más uso C++ 0x, más confío en este pensamiento. –

Cuestiones relacionadas