默认的默认构造函数?在n3290草案
defaulted default constructor ? in n3290 draft
n3290草案§12.1(构造函数)¶5:
隐式声明的默认构造函数是的
inline public
成员它的类。X
类的默认构造函数定义为deleted如果:
X
是一个类并,它有一个非平凡的变体成员默认构造函数,- 任何没有大括号或相等初始化式的非静态数据成员引用类型,
任何const限定类型(或数组)的非可变非静态数据成员没有大括号或相等初始化式的,没有用户提供的默认构造函数,X
是一个联合,它的所有变体成员都是const限定类型(或其数组),X
是非联合类,任何匿名联合成员的所有成员都是const限定类型(或其数组),- 任何直接或虚拟基类,或非静态数据成员类类型为
M
(或其数组)M
没有默认构造函数或重载解析(13.3)对M
的默认构造函数的调用将导致歧义,或者导致歧义的函数从默认的默认构造函数中删除或不可访问,或- 任何直接基类或虚基类或非静态数据成员都具有带有
中删除或无法访问的析构函数
的类型从默认的默认构造函数
请用一些示例程序解释默认的默认构造函数
我认为这段摘自维基百科的解释了这一点:
显式默认和删除的特殊成员函数
在c++ 03中,编译器为不自己提供构造函数的类提供了默认构造函数、复制构造函数、复制赋值操作符(operator=)和析构函数。程序员可以通过定义自定义版本来覆盖这些默认值。c++还定义了几个全局操作符(如operator=和operator new),它们适用于所有类,程序员可以重写它们。
然而,对这些默认值的创建几乎没有控制。例如,要使类本质上不可复制,需要声明私有复制构造函数和复制赋值操作符,而不定义它们。试图使用这些函数违反了一个定义规则。虽然不需要诊断消息,但[5]这通常会导致链接器错误。[引文需要]
对于默认构造函数,如果用任何构造函数定义了类,编译器将不会生成默认构造函数。这在很多情况下都很有用,但同时拥有专门的构造函数和编译器生成的默认值也很有用。
c++ 11将允许显式默认和删除这些特殊的成员函数。例如,以下类型显式声明它使用默认构造函数:
代码示例:
struct SomeType
{
SomeType() = default; //The default constructor is explicitly stated.
SomeType(OtherType value);
};
既然你似乎是一个标准的粉丝(几乎你所有的问题都在标准引用中寻求解释),这篇关于标准委员会如何定义默认和删除函数的文章对你来说应该是一个很好的阅读:
默认函数和删除函数
如果使用= default;
语法声明某个特殊成员函数,则该函数为"default "。你所引用的第一行的前一行是:
如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。
因此,"默认的"默认构造函数是用= default
声明的默认构造函数(可以不带参数调用的构造函数)。这可以使用= default
语法显式定义,也可以根据上面的行隐式定义。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- 具有默认模板类型的默认构造函数的类型推导
- 当给定默认值时,为什么此模板参数推导失败
- 修改 VS Code 中的默认C++代码段
- 声明默认的模板化函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何使用非默认构造函数实例化模板化类
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 格式化浮点值:返回默认值
- 默认的默认构造函数?在n3290草案