2012-12-10 39 views
6

Tôi muốn triển khai các hàm tạo di chuyển (không có hàm tạo bản sao) cho một loại nhất định cần phải là loại giá trị trong một boost::unordered_map. Hãy gọi kiểu này là Composite.Di chuyển hàm tạo và danh sách khởi tạo

Composite có chữ ký sau đây:

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 
} 

Tôi muốn viết những dòng này để boost::unordered_map< Key , Composite > không đòi hỏi các nhà xây dựng bản sao, và chỉ sử dụng các nhà xây dựng di chuyển. Nếu có thể, tôi không muốn sử dụng hàm tạo bản sao của Base trong danh sách khởi tạo của hàm tạo di chuyển là Composite.

Điều này có khả thi không?

Trả lời

11

Nói member(std::move(other.member)).

Như một quy tắc vàng, bất cứ khi nào bạn có một cái gì đó bằng cách tham khảo rvalue, bạn cần phải sử dụng nó bên std::move, và bất cứ khi nào bạn có một cái gì đó bằng cách tham chiếu phổ thông (ví dụ suy luận kiểu rập khuôn với &&), bạn cần phải sử dụng nó bên std::forward.

+1

+1 để sử dụng tốt cụm từ tương đối mới * tham chiếu chung *. – mavam

+1

@MatthiasVallentin: Thuật ngữ đó đã bị Scott Meyers từ chối ngay tại chỗ. Ủy ban tiêu chuẩn thích thuật ngữ "tham chiếu chuyển tiếp" ngày nay. –

+0

Chúng tôi gần hai năm nay, vui mừng khi thấy rằng cộng đồng đã hội tụ trên một thuật ngữ ổn định. – mavam

Các vấn đề liên quan