2010-09-06 19 views
7

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.

+0

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? –

+0

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

+0

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

Trả lời

9

Đây không phải là hình thức xấu khi xem xét tất cả các đối tượng như mutexes hoặc các đối tượng có phạm vi như unique_ptr. Unique_ptr có thể di chuyển nhưng không thể sao chép được và nó là một phần của STL.

+0

Tôi thậm chí còn thêm rằng đó là * hình thức rất tốt *. Tôi chân thành nghĩ rằng các đối tượng có thể sao chép phải là * ngoại lệ *, không phải là quy tắc. Càng sử dụng C++ 0x, tôi càng tự tin vào suy nghĩ này. –