无法访问在类中为make_unique声明的私有成员

H'H*_*H'H 1 c++

我有以下课程:具有删除副本构造函数的A类。

class A
  {
  public:
    explicit A(int i_a) {a = i_a;};
    ~A(){};
  private:
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    int a;
  };
Run Code Online (Sandbox Code Playgroud)

B类以及一个unique_ptr成员。

class A;
class B
  {
  public:
    B(int i_b);
    ~B() {};

  private:
    std::unique_ptr<A> p_b;
  };
Run Code Online (Sandbox Code Playgroud)

和B.cpp:

B::B(int i_b)
  {
  p_b = std::make_unique<A>(A(i_b));
  }
Run Code Online (Sandbox Code Playgroud)

我在制作A类的unique_ptr时收到此错误:

'A :: A':无法访问在类'A'中声明的私有成员

有人可以向我解释为什么我会收到此错误吗?我知道通过注释此行“ A(const A&)= delete;” 错误将得到解决。但是我正在寻找一些解释。

Yks*_*nen 7

  p_b = std::make_unique<A>(A(i_b));
Run Code Online (Sandbox Code Playgroud)

在此行中,您尝试调用具有deleted的副本构造函数(或移动未声明的构造函数)

相反,您应该使用:

  p_b = std::make_unique<A>(i_b);
Run Code Online (Sandbox Code Playgroud)

或者,您可以为类声明move构造函数:

class A
  {
  public:
    explicit A(int i_a) {a = i_a;};
    A(A&&) = default;
    A& operator=(A&&) = default;
    ~A(){};
  private:
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    int a;
  };
Run Code Online (Sandbox Code Playgroud)

std::make_unique将调用给定类的构造函数,并按原样传递已接收的任何参数。因此,如果您传递一个类型的对象A,它将尝试使用带有类型参数的A构造函数-即复制构造函数或移动构造函数。
因为您已经声明了复制构造函数,所以移动构造函数不会自动生成,因此它不能被使用std::make_unique