将禁用的复制构造函数放在私有中

时间:2016-11-15 11:53:34

标签: c++ c++11 copy-constructor

要禁用复制构造函数和赋值运算符,很明显我们可以这样做,因为c ++ 11:

class A {
 public:
  A(const A&) = delete;
  A& operator=(const A&) = delete;
} 

或c ++ 03:

class A {
 private:
  A(const A&);
  A& operator=(const A&);
}
然而,这会发生什么:

class A {
 private:
  A(const A&) = delete;
  A& operator=(const A&) = delete;
}

我想这也会导致相同的结果。有副作用吗?

1 个答案:

答案 0 :(得分:4)

你给删除函数的访问权限并不重要 - 它根本不存在(¹),所以无论调用者是什么都无法访问。

错误消息可能会稍微令人困惑。例如,参见http:://cpp.sh/9hv7y,其中第一个错误是关于“私有”而不是“已删除”。

¹“它不存在”是一种简化。它存在于它参与重载解析的意义上,但如果它是所选择的函数则是错误的。因此

struct only_double {
    only_double(intmax_t) = delete;
    only_double(double arg);
};
only_double zero(0); // Error - deleted constructor called