C++ 没有默认构造函数的类对象的值初始化
我试图通过C++11中的类类型C++ 没有默认构造函数的类对象的值初始化,c++,c++11,initialization,language-lawyer,C++,C++11,Initialization,Language Lawyer,我试图通过C++11中的类类型T或T{}来理解值初始化的确切行为。 让我困惑的是这两个片段取自: 值初始化的效果是: [……] 1) 如果T是一个类类型,没有默认构造函数,或者用户提供了默认构造函数,或者删除了默认构造函数,则对象默认初始化; (从C++11开始) [……] 于是我抬头看了看: 默认初始化的效果是: 如果T是[…]类类型,则将考虑构造函数,并对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)为新对象提供初始值 [……] 所以这基本上是说,如果T是一个类类型,它
T
或T{}
来理解值初始化的确切行为。
让我困惑的是这两个片段取自:
值初始化的效果是:
[……]
1) 如果T是一个类类型,没有默认构造函数,或者用户提供了默认构造函数,或者删除了默认构造函数,则对象默认初始化;
(从C++11开始)
[……]
于是我抬头看了看:
默认初始化的效果是:
- 如果T是[…]类类型,则将考虑构造函数,并对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)为新对象提供初始值李>
2) 还有什么必要明确提及“无默认构造函数”和“已删除默认构造函数”的情况 参考资料中的措辞似乎与标准中的措辞不符。C++11 8.5/7[dcl.init]: 对
T
类型的对象进行值初始化意味着:
- 如果
是一种(可能是cv限定的)类类型(第9条),且具有用户提供的构造函数(12.1),则 调用T
的默认构造函数(如果T
没有可访问的默认值,则初始化是错误的) 建造商)李>T
- 如果
是没有用户提供构造函数的(可能是cv限定的)非联合类类型,则对象 初始化为零,如果T
隐式声明的默认构造函数是非平凡的,则该构造函数为 打电话来T
- 如果
是数组类型,则每个元素都初始化了值李>T
- 否则,对象初始化为零
T
类型的对象进行值初始化意味着:
- 如果
是(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或 用户提供或删除的默认构造函数,则对象默认初始化李>T
- 如果
是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,那么 对象初始化为零,并检查默认初始化的语义约束,如果T
有一个非平凡的默认构造函数,对象默认初始化李>T
- 如果
是数组类型,则每个元素都初始化了值李>T
- 否则,对象初始化为零
是否应该是“默认构造函数”?当没有默认构造函数时,是否会进行值初始化。。??这不是编译器错误吗?@setia_u第一个要点(带有用户提供的构造函数)说:“如果
t
没有可访问的默认构造函数,则初始化是错误的”。还是说C++14版本?通过委托默认初始化(当没有可用的默认构造函数时,默认初始化是格式错误的)来“间接”声明它是格式错误的。