![](/img/trans.png)
[英]How I can implement move constructor and operator for unique_ptr as a private member of class
[英]unique_ptr member, private copy constructor versus move constructor
給定多個派生類的基類,目標是創建一個包裝類,允許STL容器使用基本接口查看對象,盡管實際上可以將不同的派生類添加到容器中。 (請參閱從異構std :: list中檢索數據 )。
經過一些修補,我想出了一個新的派生類,它是基類的unique_ptr
的包裝器。 但是,移動構造函數讓我感到困惑。
class Base {
friend class BaseWrapper;
virtual Base * clone () const = 0;
public:
virtual ~Base () {}
//... public interface
};
class Derived : public Base {
//... specific members for derived class
Base * clone () const { return new Derived(*this); }
public:
//... implement public interface
};
class BaseWrapper : public Base {
std::unique_ptr<Base> ptr_;
Base * clone () const { return ptr_->clone(); }
public:
BaseWrapper (const Base &b) : ptr_(b.clone()) {}
//... implement public interface by forwarding to ptr_
};
typedef std::list<BaseWrapper> BaseList;
int main () {
BaseList l;
l.push_back(Derived());
}
現在,為了使用BaseWrapper
,我可以實現這樣的公共移動構造函數:
BaseWrapper (BaseWrapper &&bw) { ptr_.swap(bw.ptr_); }
但是,我發現除了上面的內容, 我可以改為定義一個私有的“復制”構造函數 (當然它也可以公開):
BaseWrapper (BaseWrapper &bw) { ptr_.swap(bw.ptr_); }
有人能告訴我這是否應該有用,為什么或為什么不呢? 如果它應該工作,為什么我不能使移動構造函數私有?
您可以通過此鏈接訪問以更完整的方式說明上述內容的玩具程序。
[刪除了錯誤的診斷]
這實際上編譯在gcc 4.8上。 似乎gcc 4.7將BaseWrapper (const Base &)
作為復制構造函數(實際上不是),並隱式刪除移動構造函數(如果它確實是復制構造函數,那么它將是預期的行為)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.