没有默认构造函数的值初始化

Pet*_*ica 5 c++ constructor initialization language-lawyer

我想知道在什么情况下类可能没有默认构造函数但仍会进行值初始化。“无默认构造函数”的典型情况是存在参数化构造函数并且默认构造函数未默认= default )。

\n

引用 2020 年标准第 9.4.1 章“初始化器/常规”(最新草案包含等效措辞):

\n
\n

对类型 T 的对象进行值初始化意味着:
\n(8.1) \xe2\x80\x94 如果 T 是(可能是 cv 限定的)类类型(第 11 条),则
\n(8.1.1) \xe2\ x80\x94 如果 T 没有默认构造函数(11.4.5.2) 或者用户提供或删除的默认构造函数,则该对象被默认初始化;

\n
\n

\n
\n

11.4.5.2 默认构造函数 [class.default.ctor]:\n1 类 X 的默认构造函数是类 X 的构造函数,其中每个不是函数参数包的参数都有一个默认实参(包括构造函数的情况)没有参数)。如果类 X 没有用户声明的构造函数,则没有参数的非显式构造函数将被隐式声明为默认构造函数 (9.5)

\n
\n

我读到这个,8.1.1 根本没有引用没有构造函数的情况(因为,正如 11.4.5.2 解释的那样,然后隐式声明了默认构造函数)。相反,我将其理解为“根本没有默认构造函数”(包括隐式构造函数)。

\n

值初始化与new()大括号初始化一起发生,并且对于大括号初始化的数组中的多余元素(如struct T{}; T arr[1]{};)。

\n

当“没有默认构造函数”时,这两种构造都不会编译。是否存在没有默认构造函数的类型的对象根本被值初始化的情况?我是不是误读了8.1.1?

\n

Dav*_*ing 2

它\xe2\x80\x99只是说,对缺少默认构造函数的类类型的对象进行值初始化会尝试对其进行默认初始化,但失败了。请注意,下一个项目符号中的替代方案在零初始化后仍然默认初始化它,因此它\xe2\x80\x99不再默认初始化,因为没有默认构造函数。

\n

根据 [class.default.ctor] 的 one\xe2\x80\x99s 解释,它也可能被认为涵盖了可以通过可变参数构造函数模板默认初始化类的情况:

\n
struct A {\n  template<class ...TT> A(TT...);\n};\nauto a=A();  // value-initialization -> default-initialization\n
Run Code Online (Sandbox Code Playgroud)\n