2012-12-10 8 views
6

Ich möchte Move-Konstruktoren (kein Kopierkonstruktor) für einen bestimmten Typ implementieren, der ein Werttyp in einem boost::unordered_map sein muss. Nennen wir diesen Typ Composite.Move-Konstruktor und Initialisierungsliste

Composite hat die folgende Signatur:

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 
} 

Ich möchte dies schreiben, so boost::unordered_map< Key , Composite > nicht den Kopierkonstruktor benötigt und verwendet nur den Umzug Konstruktor. Wenn möglich, möchte ich nicht den Kopierkonstruktor Base in der Initialisierungsliste des Move-Konstruktors von Composite verwenden.

Ist das möglich?

Antwort

11

Sagen Sie member(std::move(other.member)).

Als goldene Regel, wenn Sie etwas von rvalue Bezug nehmen, müssen Sie es innerhalb std::move verwenden, und wenn Sie etwas von Universal-Referenz (das heißt abgeleitet Templat-Typ mit &&) nehmen, müssen Sie es innerhalb std::forward verwenden.

+1

+1 für eine gute Verwendung der relativ neuen Begriff * Universalreferenz *. – mavam

+1

@MatthiasVallentin: Dieser Begriff wurde auf der Stelle von Scott Meyers erfunden. Der Normenausschuss bevorzugt heutzutage den Begriff "Forwarding Reference". –

+0

Wir sind jetzt fast zwei Jahre alt, froh zu sehen, dass sich die Gemeinschaft auf einen stabilen Begriff eingelassen hat. – mavam

Verwandte Themen