将禁用的复制构造函数置于私有状态

put disabled copy constructor in private

要禁用复制构造函数和赋值运算符,很明显我们可以这样做,因为 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;
}

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

无论您为已删除的函数提供何种访问权限都无关紧要 - 它根本不存在 (¹),因此无论调用者如何,都无法访问它。

错误消息可能会稍微令人困惑。例如,参见 http:://cpp.sh/9hv7y,其中第一个错误是关于 "private" 而不是 "deleted"。


¹ "it doesn't exist" 是一种简化。它的存在是因为它参与了重载决议,但如果它是被选择的函数,它就是一个错误。于是

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