Tôi muốn trả lại đối tượng không thể sao chép loại Foo
từ một hàm. Về cơ bản, đây là một đối tượng trợ giúp mà người gọi sẽ sử dụng để thực hiện một tập hợp các hành động, với một destructor để thực hiện một số dọn dẹp sau khi các hành động hoàn tất.Hình thức này có tệ không khi chỉ cung cấp một hàm tạo di chuyển?
Trước khi sự ra đời của rvalue references, tôi đã trả về một số shared_ptr<Foo>
hoặc một cái gì đó tương tự. Với các tham chiếu rvalue, một tùy chọn khác sẽ là tạo ra hàm tạo và sao chép hàm tạo riêng, và có hàm tạo công khai duy nhất là một hàm tạo di chuyển. Foo
sẽ giống như thế này:
class Foo : boost::noncopyable
{
private:
Foo(/* whatever the real ctor needs */);
public:
Foo(Foo && src);
// ... interesting stuff ...
};
Foo a(SomethingThatReturnsFoo()); // allowed
Foo b; // error, no public default constructor
Foo c(a); // error, noncopyable
Foo d = a; // error, noncopyable
Câu hỏi của tôi là liệu nó sẽ là hình thức xấu để làm điều này, hoặc cho dù nó có vẻ hợp lý. Tôi không thể nghĩ ra bất kỳ lý do nào tại sao điều này sẽ gây ra vấn đề hoặc khó đọc, nhưng tôi vẫn là một phần của một newbie khi nói đến tham khảo rvalue, vì vậy có thể có những cân nhắc mà tôi không nghĩ đến.
Nhận xét nhỏ: nếu bạn cung cấp một 'Constructor di chuyển', mọi người có thể sẽ mong đợi một' Toán chuyển nhượng nhiệm vụ'. Bạn có kế hoạch cung cấp nó, hay bạn muốn một lớp học bất biến? –
Trong trường hợp đặc biệt này, nó được dự định là không thay đổi, vì vậy tôi không muốn phân công, nhưng đó là một điểm tốt nói chung. – Charlie
btw, với những thay đổi gần đây trong bộ phận hoạt động sao chép/di chuyển do trình biên dịch tạo ra, bạn thực sự không cần phải lấy được từ boost :: noncopyable nữa. Việc khai báo một hàm tạo di chuyển sẽ ngăn trình biên dịch tạo ra bất kỳ hoạt động sao chép/di chuyển nào khác, xem http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze