2012-12-10 16 views
6

Chcę zaimplementować konstruktory przenoszenia (bez konstruktora kopiowania) dla określonego typu, który musi być typem wartości w boost::unordered_map. Nazwijmy ten typ Composite.Przenoszenie konstruktora i listy inicjowania

Composite ma następujący podpis:

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 
} 

chcę napisać to tak boost::unordered_map< Key , Composite > nie wymaga konstruktor kopiujący i po prostu używa konstruktora ruch. Jeśli to możliwe, nie chcę używać konstruktora kopiowania z Base na liście inicjalizacyjnej konstruktora przenoszenia Composite.

Czy to możliwe?

Odpowiedz

11

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

W złotej reguły, gdy wziąć coś przez odniesienie rvalue, trzeba go używać wewnątrz std::move, a gdy wziąć coś od uniwersalnego odniesienia (tj wywnioskować matrycy typu z &&), trzeba go używać wewnątrz std::forward.

+1

+1 za dobre wykorzystanie względnie nowego terminu * odwołanie uniwersalne *. – mavam

+1

@MatthiasVallentin: Ten termin został wymyślony na miejscu przez Scotta Meyersa. Komitet normalizacyjny preferuje obecnie termin "referencje spedycyjne". –

+0

Jesteśmy teraz prawie dwa lata, ciesząc się, że społeczność osiągnęła stabilny okres. – mavam

Powiązane problemy