Desidero restituire un oggetto non copiabile di tipo Foo
da una funzione. Questo è fondamentalmente un oggetto helper che il chiamante userà per eseguire una serie di azioni, con un distruttore per eseguire una pulizia dopo che le azioni sono state completate.È una cattiva forma fornire solo un costruttore di mosse?
Prima dell'avvento di rvalue references, avrei restituito un shared_ptr<Foo>
o qualcosa di simile. Con i riferimenti rvalue, un'altra opzione sarebbe rendere privato il costruttore e il costruttore della copia e l'unico costruttore pubblico essere un costruttore di mosse. Foo
sarebbe simile a questa:
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
La mia domanda è se sarebbe cattiva forma per fare questo, o se sembra ragionevole. Non riesco a pensare ad alcun motivo per cui ciò potrebbe causare problemi o essere difficile da leggere, ma sono ancora un po 'un principiante quando si tratta di riferimenti di valore, quindi potrebbero esserci considerazioni a cui non sto pensando.
Osservazione secondaria: se fornisci un 'Move Constructor', la gente probabilmente si aspetta anche un' Move Assignment Operator'. Hai intenzione di fornirlo o vuoi una lezione immutabile? –
In questo caso particolare è inteso essere immutabile, quindi non voglio un incarico, ma questo è un buon punto in generale. – Charlie
btw, con le recenti modifiche nel reparto operazioni di copia/spostamento generato dal compilatore, non è più necessario derivare da boost :: noncopyable. Dichiarare un costruttore di mosse impedisce già al compilatore di generare altre operazioni di copia/spostamento, vedi http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze