C++20指定初始化中留空的字段是否保证被零初始化?

9
使用C++20指定初始化器时,不需要为每个字段指定一个值:
struct Foo
{
    int i;
    void* p;
};

可以像这样进行初始化:

Foo bar = {
    .i = 22
};

被省略的字段是否被初始化为零?所以在这个例子中,p是否保证被设置为nullptr
2个回答

9
这种情况下是的。规则如下(来源于[dcl.init]/5):
对于非联合聚合体,每个未显式初始化的元素初始化如下: - 如果该元素具有默认成员初始化程序([class.mem]),则从该初始化程序初始化该元素。 - 否则,如果该元素不是引用,则从空初始化程序列表([dcl.init.list])进行复制初始化。 - 否则,程序是非法的。
在这种情况下,p没有被显式初始化。它没有默认成员初始化程序,所以我们转到第二个项目。它不是引用,所以它从{}进行复制初始化。对于void*类型,这是零初始化。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接