将禁用的复制构造函数置于私有状态
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
要禁用复制构造函数和赋值运算符,很明显我们可以这样做,因为 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