复制构造函数以转移unique_ptr的所有权

gcs*_*osh 6 c++ copy-constructor ownership unique-ptr

我需要编写一个复制构造函数,它还传输要复制的对象的unique_ptr成员的所有权.情况如下:

class C{
   // C class stuff       
};

class A{
public:
    public A();
    public A(const A& a);
private:
    std::unique_ptr<C> c_;
}

class B{

public:

    B(const A& b) : a_(a){}

private:
     A a_;


};
Run Code Online (Sandbox Code Playgroud)

我该如何实现复制构造函数A

Ada*_*nek 6

我想你的意图或方法是错误的.

复制构造函数用于创建参数的副本,但由于unique_ptr维护了独占所有权,因此无法复制它.实际上,您可以创建unique_ptr成员mutable,然后将它指向的资源移动到复制构造函数中,但这绝对是疯了(这就是做什么std::auto_ptr,这就是为什么它已被弃用).

因此,您需要:

  • 向A和B添加一个move-constructor(+ make copy-constructor deleted)
  • 切换unique_ptrshared_ptr,但仅当C实际上是要共享时

还有第三个选项,即在A的复制构造函数中创建unique_ptr所指向的对象的副本,即:

A::A(const A& a) : c_(std::unique_ptr<C>(a.c_ ? new C(*a.c_) : nullptr)) {
}
Run Code Online (Sandbox Code Playgroud)

  • @DavidHaim,但是OP希望在copy-constructor中转移所有权 - 这就是问题的标题所说的.我认为这是错误的方法. (4认同)
  • @Gabrielecswoosh,你有:http://melpon.org/wandbox/permlink/bbvgsx31iuofzF4s.请注意,当您将仅移动类型作为成员时,编译器默认为您生成相同的代码,例如unique_ptr:http://melpon.org/wandbox/permlink/7AlOoXZSOMOSLiFa(注意A中没有复制/移动构造函数)它仍然按预期工作) (2认同)