2010-09-06 10 views
7

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.

+0

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? –

+0

In questo caso particolare è inteso essere immutabile, quindi non voglio un incarico, ma questo è un buon punto in generale. – Charlie

+0

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

risposta

9

Questa non è affatto una cattiva forma, considera oggetti come mutex o oggetti con scope come unique_ptr. Unique_ptr è mobile ma non è copiato e fa parte dell'STL.

+0

Vorrei aggiungere che è * ottimo modulo *. Credo sinceramente che gli oggetti copiabili dovrebbero essere l'eccezione *, non la regola. Più uso C++ 0x, più sono fiducioso in questo modo di pensare. –

Problemi correlati