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.
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. –
@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. –
Ồ. 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. –