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*,这是零初始化。