Unique_ptr成员,私有复制构造函数与移动构造函数



给定多个派生类的基类,目标是创建一个包装器类,允许STL容器看到具有基接口的对象,尽管实际上可能会将不同的派生类添加到容器中。(参见从异构std::list中检索数据)。

经过一些修补,我想出了一个新的派生类,它是一个围绕unique_ptr到基类的包装器。但是,move构造函数把我弄糊涂了。

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 &)作为复制构造函数(实际上不是),并隐式删除move构造函数(如果它确实是复制构造函数,这将是预期的行为)。

相关内容

  • 没有找到相关文章

最新更新