2011-01-29 31 views
11

xem xét như sau:Có cần phải xác định các nhà thầu di chuyển từ các lớp khác nhau không?

struct X 
{ 
    Y y_; 

    X(const Y & y) :y_(y) {}  
    X(Y && y) :y_(std::move(y)) {} 
}; 

Có cần phải xác định một constructor như một giây để tận dụng tối đa ngữ nghĩa di chuyển? Hoặc nó sẽ được đưa về chăm sóc tự động trong các tình huống thích hợp?

+0

Một nhà xây dựng di chuyển hoặc toán tử gán được tạo ra hoàn toàn [trong một số trường hợp nhất định] (http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor/4820339#4820339). Vì bạn đã khai báo một hàm tạo bản sao ở đây, bạn cũng sẽ phải tự khai báo và định nghĩa một hàm tạo di chuyển thích hợp. Tuy nhiên, bạn có thể loại bỏ cả hai và có cùng hành vi trong trường hợp cụ thể của bạn. –

+1

@James: Thông tin tiện dụng. Tuy nhiên, tôi không định nghĩa một hàm tạo bản sao ở đây. Tôi đã định nghĩa một hàm tạo từ Y thành X. –

+0

Ồ. Xin lỗi về điều đó, tôi chỉ nhìn thấy các chữ cái và hình dung chúng giống nhau. –

Trả lời

7

Có, nhưng không. Mã của bạn chỉ nên này:

struct X 
{ 
    Y y_; 

    X(Y y) : // either copy, move, or elide a Y 
    y_(std::move(y)) // and move it to the member 
    {} 
}; 

Nếu bạn đã từng nói trong thiết kế "Tôi cần bản sao riêng của tôi về những dữ liệu này" *, sau đó bạn chỉ nên dùng đối số theo giá trị và di chuyển nó đến nơi nó cần phải được . Công việc của bạn không phải là quyết định cách xây dựng giá trị đó, điều đó tùy thuộc vào các nhà thầu có sẵn cho giá trị đó, vì vậy hãy để nó tạo ra lựa chọn đó, bất kể nó là gì và làm việc với kết quả cuối cùng.

* này áp dụng cho các chức năng quá, tất nhiên, ví dụ:

void add_to_map(std::string x, int y) // either copy, move or elide a std::string 
{ 
    // and move it to where it needs to be 
    someMap.insert(std::make_pair(std::move(x), y)); 
} 

Lưu ý rằng được áp dụng trong C++ 03 quá, hơi, nếu một loại là constructible mặc định và swappable (mà vẫn đang di chuyển):

// C++03 
struct X 
{ 
    std::string y_; 

    X(std::string y) // either copy or elide a std::string 
    { 
     swap(y_, y); // and "move" it to the member 
    } 
}; 

Mặc dù điều này dường như không được thực hiện rộng rãi.

+0

Chính xác những gì tôi đang tìm kiếm, một cách để thực hiện chúng trong một chức năng. Cảm ơn GMan. –

1

Có, nó là cần thiết. Một ref const chỉ có thể là một bản sao, không phải là một di chuyển.

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