gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:47:20 25 4
gpt4 key购买 nike

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

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

To value-initialize an object of type T means:
(8.1) — if T is a (possibly cv-qualified) class type (Clause 11), then
(8.1.1) — if T has either no default constructor (11.4.5.2) or a default constructor that is user-provided or deleted, then the object is default-initialized;

11.4.5.2 Default constructors [class.default.ctor]:1 A default constructor for a class X is a constructor of class X for which each parameter that is not a function parameter pack has a default argument (including the case of a constructor with no parameters). If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted (9.5)

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

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

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

最佳答案

这只是说对缺少默认构造函数的类类型的对象进行值初始化尝试并失败以对其进行默认初始化。请注意,下一个项目符号中的备选方案在对其进行零初始化后仍对其进行默认初始化,因此它没有进行任何默认初始化更多因为没有默认构造函数。

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

struct A {
template<class ...TT> A(TT...);
};
auto a=A(); // value-initialization -> default-initialization

关于c++ - 没有默认构造函数的值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69800375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com