C++ 将禁用的复制构造函数置于专用模式
要禁用复制构造函数和赋值运算符,很明显我们可以这样做,因为c++11:C++ 将禁用的复制构造函数置于专用模式,c++,c++11,copy-constructor,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
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;
}
我想这也会导致同样的结果。有副作用吗 您对已删除函数的访问权限无关紧要——它根本不存在(imk_),因此无论调用方如何都无法访问它 错误消息可能会稍微让人困惑。请参阅第一个错误是关于“private”而不是“deleted”的示例
“它不存在”是一种简化。它存在于它参与重载解析的意义上,但如果它是所选函数,则是一个错误。因此
struct only_double {
only_double(intmax_t) = delete;
only_double(double arg);
};
only_double zero(0); // Error - deleted constructor called
无论您对已删除的函数授予何种访问权,它都不存在(imk_),因此无论调用方如何都无法访问它 错误消息可能会稍微让人困惑。请参阅第一个错误是关于“private”而不是“deleted”的示例
“它不存在”是一种简化。它存在于它参与重载解析的意义上,但如果它是所选函数,则是一个错误。因此
struct only_double {
only_double(intmax_t) = delete;
only_double(double arg);
};
only_double zero(0); // Error - deleted constructor called
为什么不试试,看看会发生什么。可能是重复的和/或我试过了。这三种方法都是一样的。你为什么不试试,看看会发生什么。可能是重复的和/或我试过了。这三个函数都是一样的。是的,删除函数实际上并不存在,所以访问器并不重要。这就解释了。谢谢我想说它不存在是不对的。请注意-一个定义规则适用于已删除的定义。有关更多详细信息,请参阅。@skypjack:是的。这在问题的上下文中是正确的,但我添加了一个脚注(结果比真实答案长!)是的,删除函数实际上不存在,所以访问器并不重要。这就解释了。谢谢我想说它不存在是不对的。请注意-一个定义规则适用于已删除的定义。有关更多详细信息,请参阅。@skypjack:是的。这在问题的上下文中是正确的,但我添加了一个脚注(结果比真实答案长!)