已删除的构造函数必须是私有的
Must a deleted constructor be private?
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
。 - 复制和移动构造函数将
private
在具体的final
类中,在大多数情况下只能由friends
实例化。
在所有情况下,您都会向类的相应用户而不是类的所有用户发出通知。
相关文章:
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- std::ofstream 作为类成员删除复制构造函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 具有已删除移动和复制构造函数的类的就地构造
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 我的类中几乎所有的构造函数和解构函数都被隐式定义为已删除?
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 调用类模板中隐式删除的复制构造函数
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 不带初始值设定项的构造函数列表,其中包含带有已删除构造函数的对象
- 是否可以实例化具有已删除构造函数和析构函数的非聚合类?
- 为什么编译器在试图初始化具有C 11样式的对象数组时隐含删除构造函数
- 调用的已删除构造函数
- 为什么要显式删除构造函数而不是将其设为私有?
- 如何创建此已标记联合的实例?关于已删除构造函数的编译器错误