class A
{
public:
A() = default;
A(const A&) = delete;
};
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
这两个定义在任何情况下都是完全相同的吗?
class A
{
public:
A() = default;
A(const A&) = delete;
};
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
这两个定义在任何情况下都是完全相同的吗?
它们只在生成的诊断方面不同。如果将其设为private
,将会报告额外且多余的访问冲突:
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
int main()
{
A a;
A a2=a;
}
以上操作会导致GCC 4.8产生以下额外的输出:
main.cpp: In function 'int main()':
main.cpp:6:5: error: 'A::A(const A&)' is private
A(const A&) = delete;
^
main.cpp:12:10: error: within this context
A a2=a;
^
因此,我建议始终将删除的方法设为public
。
我想扩展Daniel Frey的答案。与其将删除的方法始终设置为public
,我宁愿为这些方法分配一个访问修饰符,如果它们没有被删除,你会给这些方法的(假设)访问修饰符。(如果程序员有选择,我不喜欢始终这个词。如果确实将删除的方法设置为public
是铁板钉钉的,那么语言本身应该强制执行。)
一些经验法则/指南:
public
。public
。protected
。friends
实例化的具体final
类的拷贝和移动构造函数将为private
。在所有情况下,你需要向类的适当用户宣布而不是所有用户宣布。