繁体   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