簡體   English   中英

unique_ptr成員,私有拷貝構造函數與移動構造函數

[英]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());
}

這不能用g ++ 4.7.2編譯

現在,為了使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM