我试图通过以下方式了解值初始化的确切行为T()
or T{}
对于类类型T
在 C++11 中。
让我困惑的是这两个片段取自http://en.cppreference.com http://en.cppreference.com:
值初始化: http://en.cppreference.com/w/cpp/language/value_initialization
值初始化的效果是:
[...]
1) 如果 T 是一个类类型没有默认构造函数或用户提供的或删除了默认构造函数,该对象是默认初始化的;
(自 C++11 起)
[...]
所以我抬起头来默认初始化 http://en.cppreference.com/w/cpp/language/default_initialization:
默认初始化的效果是:
- 如果 T 是 [...] 类类型,则考虑构造函数并针对空参数列表进行重载解析。选择的构造函数(即默认构造函数之一) 被调用来为新对象提供初始值;
[...]
所以这基本上是说,如果 T 是类类型并且其隐式默认构造函数不可用,那么该对象将通过调用其默认构造函数之一来构造?根据我的理解,这仅对于上述用户提供的默认构造函数的情况才有意义;然后,在构造时,只有构造函数中明确声明的内容才会被执行,并且每个未显式初始化的成员都将被默认初始化(如果我在这里错了,请纠正我)。
我的问题:
1)如果有的话会发生什么没有用户提供的默认构造函数并且没有默认构造函数或者它被删除了?我猜代码无法编译。如果这是正确的,那么:
2)还需要什么明确提及“没有默认构造函数”和“删除默认构造函数”的情况?
cppreference 上的措辞似乎与标准中的措辞不符。 C++11 8.5/7 [dcl.init]:
To 值初始化类型的对象T
means:
- if
T
是一个(可能是 cv 限定的)类类型(第 9 条),具有用户提供的构造函数 (12.1),那么
默认构造函数T
被调用(并且初始化是错误的,如果T
没有可访问的默认值
构造函数);
- if
T
是一个(可能是 cv 限定的)非联合类类型,没有用户提供的构造函数,则该对象
是零初始化的,如果T
的隐式声明的默认构造函数是不平凡的,该构造函数是
叫。
- if
T
是数组类型,那么每个元素都是值初始化的;
- 否则,该对象将被零初始化。
值初始化的对象被视为已构造,因此受本国际规定的约束
适用于“构造”对象、“构造函数已完成”的对象等的标准,
即使没有调用构造函数来初始化对象。
作为比较,这是 C++14 (n4140) 8.5/7 [dcl.init] 中的措辞:
To 值初始化类型的对象T
means:
- if
T
是一个(可能是 cv 限定的)类类型(第 9 条),没有默认构造函数 (12.1) 或
用户提供或删除的默认构造函数,则该对象被默认初始化;
- if
T
是一个(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,那么
该对象是零初始化的,并且检查默认初始化的语义约束,并且如果T
有一个不平凡的默认构造函数,该对象是默认初始化的;
- if
T
是数组类型,那么每个元素都是值初始化的;
- 否则,该对象将被零初始化。
值初始化的对象被视为已构造,因此受本国际规定的约束
适用于“构造”对象、“构造函数已完成”的对象等的标准,
即使没有调用构造函数来初始化对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)