2012-12-10 16 views
6

Voglio implementare i costruttori di movimento (nessun costruttore di copia) per un certo tipo che deve essere un tipo di valore in un boost::unordered_map. Chiamiamo questo tipo Composite.Spostamento costruttore e lista di inizializzazione

Composite ha la seguente firma:

struct Base 
{ 
    Base(..stuff, no default ctor) : initialization list {} 
    Base(Base&& other) : initialization list {} 
} 

struct Composite 
{ 
    Base member; 
    Composite(..stuff, no default ctor) : member(...) {} 
    Composite(Composite&& other) : member(other.member) {} // <---- I want to make sure this invokes the move ctor of Base 
} 

voglio scrivere questo in modo boost::unordered_map< Key , Composite > non richiede il costruttore di copia, e utilizza solo il costruttore mossa. Se possibile, non voglio utilizzare il costruttore di copie di Base nell'elenco di inizializzazione del costruttore di spostamenti di Composite.

È possibile?

risposta

11

Dire member(std::move(other.member)).

Di regola d'oro, ogni volta che si prende qualcosa con riferimento rvalue, è necessario utilizzare all'interno std::move, e ogni volta che si prende qualcosa con riferimento universale (cioè di tipo su modelli dedotto con &&), è necessario utilizzare all'interno std::forward.

+1

+1 per un buon uso del termine relativamente nuovo * riferimento universale *. – mavam

+1

@MatthiasVallentin: questo termine è stato ideato sul posto da Scott Meyers. Il comitato standard preferisce il termine "riferimento di inoltro" al giorno d'oggi. –

+0

Siamo quasi due anni in ora, lieti di vedere che la comunità è convergere su un termine stabile. – mavam

Problemi correlati