为啥在没有初始化任何内容时使用初始化列表?

Posted

技术标签:

【中文标题】为啥在没有初始化任何内容时使用初始化列表?【英文标题】:Why use an initializer list when it initializes nothing?为什么在没有初始化任何内容时使用初始化列表? 【发布时间】:2022-01-05 15:21:50 【问题描述】:

在这个sn-p中:

struct Result

    Result() : output1();
    int output1[100];

Result() : output1(); 是做什么的?

我知道: output1() 是初始化列表,但是为什么在它什么都不做的时候还要提到它呢?

【问题讨论】:

如果你不知道它做了什么,那你为什么认为它什么都不做呢? 【参考方案1】:

它做了一些事情:它将 output1 初始化为零,而不是让它未初始化。

详细来说,这称为值初始化,这里详细解释:https://en.cppreference.com/w/cpp/language/value_initialization

值初始化的效果是:

    如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数的类类型,则该对象是默认初始化的; 如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认构造函数的类),则对象为零初始化,语义检查默认初始化的约束,如果 T 有一个非平凡的默认构造函数,则该对象是默认初始化的; 如果 T 是数组类型,则数组的每个元素都是值初始化的; 否则,对象被零初始化。

因为它是一个数组,所以适用第 3 种情况。然后该规则递归地应用于数组中的每个值,导致案例 4 将值设置为 0。

【讨论】:

为视觉学习者添加此评论:查看this 代码示例。

以上是关于为啥在没有初始化任何内容时使用初始化列表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在初始化列表中没有创建额外副本的情况下分配数据?

为啥 C++ 列表初始化也会考虑常规构造函数?

为啥初始化此类时不调用列表初始化?

当初始化列表可用时,为啥现在使用可变参数?

为啥 Swiper 没有在离子模式上初始化?

为啥我的数组列表即使在初始化后也会抛出空指针异常?