C++20指定初始化遗漏的字段是否保证初始化为零?

当使用 C++ 20 指定的初始化器时,不需要为每个字段指定一个值:

struct Foo
{
    int i;
    void* p;
};

可以这样初始化:

Foo bar = {
    .i = 22
};

遗漏的字段是否为零初始化?所以在这个例子中p保证被设置为nullptr?

回答

遗漏的字段是否为零初始化?

在这种情况下,是的。规则是(来自[dcl.init]/5):

对于非联合聚合,每个不是显式初始化元素的元素都按如下方式初始化:

  • 如果元素有一个默认成员初始值设定项([class.mem]),则元素从该初始值设定项进行初始化。
  • 否则,如果元素不是引用,则从空的初始化列表 ([dcl.init.list]) 中复制初始化该元素。
  • 否则,程序格式错误。

在这种情况下p没有显式初始化。它没有默认的成员初始值设定项,所以我们落到第二个项目符号上。它不是一个引用,所以它是从{}. 对于 a void*,这是零初始化。


以上是C++20指定初始化遗漏的字段是否保证初始化为零?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>