C++ 没有默认构造函数的类对象的值初始化

C++ 没有默认构造函数的类对象的值初始化,c++,c++11,initialization,language-lawyer,C++,C++11,Initialization,Language Lawyer,我试图通过C++11中的类类型T或T{}来理解值初始化的确切行为。 让我困惑的是这两个片段取自: 值初始化的效果是: [……] 1) 如果T是一个类类型,没有默认构造函数,或者用户提供了默认构造函数,或者删除了默认构造函数,则对象默认初始化; (从C++11开始) [……] 于是我抬头看了看: 默认初始化的效果是: 如果T是[…]类类型,则将考虑构造函数,并对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)为新对象提供初始值 [……] 所以这基本上是说,如果T是一个类类型,它

我试图通过C++11中的类类型
T
T{}
来理解值初始化的确切行为。 让我困惑的是这两个片段取自:

值初始化的效果是: [……]

1) 如果T是一个类类型,没有默认构造函数,或者用户提供了默认构造函数,或者删除了默认构造函数,则对象默认初始化; (从C++11开始)

[……]

于是我抬头看了看:

默认初始化的效果是:

  • 如果T是[…]类类型,则将考虑构造函数,并对空参数列表进行重载解析。调用所选的构造函数(默认构造函数之一)为新对象提供初始值
[……]

所以这基本上是说,如果T是一个类类型,它的隐式默认构造函数不可用,那么这个对象将通过调用它的一个默认构造函数来构造?在我的理解中,这仅适用于所提到的用户提供的默认构造函数的情况;然后,在构造时,只执行该构造函数中显式声明的内容,未显式初始化的每个成员都将得到默认初始化(如果我在这里出错,请纠正我)

我的问题:

1) 如果没有用户提供的默认构造函数,并且没有默认构造函数或者它被删除了,会发生什么?我猜代码不会编译。如果这是正确的,那么:


2) 还有什么必要明确提及“无默认构造函数”和“已删除默认构造函数”的情况

参考资料中的措辞似乎与标准中的措辞不符。C++11 8.5/7[dcl.init]:

T
类型的对象进行值初始化意味着:

  • 如果
    T
    是一种(可能是cv限定的)类类型(第9条),且具有用户提供的构造函数(12.1),则 调用
    T
    的默认构造函数(如果
    T
    没有可访问的默认值,则初始化是错误的) 建造商)
  • 如果
    T
    是没有用户提供构造函数的(可能是cv限定的)非联合类类型,则对象 初始化为零,如果
    T
    隐式声明的默认构造函数是非平凡的,则该构造函数为 打电话来
  • 如果
    T
    是数组类型,则每个元素都初始化了值
  • 否则,对象初始化为零
价值初始化的物体被视为已建造,因此受本国际标准规定的约束 标准适用于“建造”对象、“建造师已完成的”对象等。, 即使没有为对象的初始化调用构造函数

作为比较,这是C++14(n4140)8.5/7[dcl.init]中的措辞:

T
类型的对象进行值初始化意味着:

  • 如果
    T
    是(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或 用户提供或删除的默认构造函数,则对象默认初始化
  • 如果
    T
    是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,那么 对象初始化为零,并检查默认初始化的语义约束,如果
    T
    有一个非平凡的默认构造函数,对象默认初始化
  • 如果
    T
    是数组类型,则每个元素都初始化了值
  • 否则,对象初始化为零
价值初始化的物体被视为已建造,因此受本国际标准规定的约束 标准适用于“建造”对象、“建造师已完成的”对象等。, 即使没有为对象的初始化调用构造函数


是否应该是“默认构造函数”?当没有默认构造函数时,是否会进行值初始化。。??这不是编译器错误吗?@setia_u第一个要点(带有用户提供的构造函数)说:“如果
t
没有可访问的默认构造函数,则初始化是错误的”。还是说C++14版本?通过委托默认初始化(当没有可用的默认构造函数时,默认初始化是格式错误的)来“间接”声明它是格式错误的。