n3290草案§12.1(构造函数)中的一点¶5:
隐式声明的默认构造函数是
inline public
成员 它的班级。类X
的默认默认构造函数被定义为已删除 如果:
X
是一个类似联合的类,其变体成员具有非平凡性 默认构造函数,- 任何没有大括号或等号初始化程序的非静态数据成员 参考类型,
- const-qualified类型(或数组)的任何非变量非静态数据成员 没有支撑或等于初始化器的没有用户提供的 默认构造函数,
X
是一个联合,其所有变体成员都是const限定类型 (或其阵列),X
是一个非联盟类,任何匿名联盟成员的所有成员都是 const限定类型(或其数组),- 任何直接或虚拟基类,或者没有的非静态数据成员 brace-or-equal-initializer,具有类类型
M
(或其数组)和其中之一M
没有应用的默认构造函数或重载决策(13.3)M
的默认构造函数导致歧义或函数导致 从默认的默认构造函数中删除或无法访问,或- 任何直接或虚拟基类或非静态数据成员都具有带有
的类型 从默认的默认构造函数中删除或无法访问的析构函数
请使用一些示例程序解释默认默认构造函数。
答案 0 :(得分:2)
我认为来自维基百科的 this 摘录解释了这一点:
明确默认并删除特殊成员函数
在C ++ 03中,编译器为没有自己提供的类提供了默认构造函数,复制构造函数,复制赋值运算符(operator =)和析构函数。程序员可以通过定义自定义版本来覆盖这些默认值。 C ++还定义了几个全局运算符(例如operator =和operator new),它们适用于程序员可以覆盖的所有类。
但是,对这些默认值的创建几乎没有控制权。例如,使类本身不可复制,需要声明私有复制构造函数和复制赋值运算符,而不是定义它们。尝试使用这些功能违反了一个定义规则。虽然不需要诊断消息,[5]这通常会导致链接器错误。[需要引证]
对于默认构造函数,如果使用任何构造函数定义类,编译器将不会生成默认构造函数。这在许多情况下很有用,但是能够同时拥有专门的构造函数和编译器生成的默认值也很有用。
C ++ 11将允许显式默认和删除这些特殊成员函数。例如,以下类型显式声明它使用默认构造函数:
代码示例:
struct SomeType
{
SomeType() = default; //The default constructor is explicitly stated.
SomeType(OtherType value);
};
由于您似乎是Standerdese的粉丝(几乎所有的问题都在寻求标准报价的解释),这篇关于标准委员会如何定义默认和删除函数的论文应该是一个很好的阅读:
答案 1 :(得分:0)
如果使用= default;
语法声明,则其中一个特殊成员函数是“默认的”。您引用的第一行之前的行说明:
如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。
因此,“默认”默认构造函数是使用= default
声明的默认构造函数(可以不带参数调用的构造函数)。这可以使用= default
语法明确定义,或者根据上述行隐式定义。