当使用结构的聚合/指定初始化时,可以引用另一个字段,如下所示:
#include <stdio.h>
int main()
{
struct
{
int a;
int b;
}
s =
{
.a = 3,
.b = s.a + 1,
};
return 0;
}
我们在初始化s.b时使用s.a。但是,我们需要引用s.a到s。是否可以将s.a直接引用为.a
或类似的内容?例如,这将使初始化结构数组时可以使用相同的语法,如以下所示:
int main()
{
struct
{
int a;
int b;
}
s[] =
{
{
.a = 3,
.b = s[0].a + 1,
},
{
.a = 5,
.b = s[1].a - 1,
}
};
return 0;
}
在这里,我们可以写一些类似.b = .a - 1
的东西,而不是.b = s[1].a - 1
。
是否可以直接将
s.a
称为.a
或类似的内容?
否,在此上下文中,.a
是指示符,在用于通过匹配指示符初始化给定数据成员的大括号或相等初始化器中不能引用它。
struct Bar { int a; };
struct Foo {
int a;
Bar b;
};
int main() {
Foo f = {
// ^ start of braced-init-list
.a
// ^^ designator (for data member of Foo)
= 1,
// ^^^ initializer-clause
.b{.a = 2}
// ^^^^^^^^ braced-init-list
// referring to a designator of a
// data member of Bar
};
}
详细信息
指定初始化器是P0329R4引入的一个新的C++20功能,是支持的init lists:语法的一部分
braced-init-list: { initializer-list ,opt } { designated-initializer-list ,opt } { }
其中指定初始化器列表的语法为:
designated-initializer-list: designated-initializer-clause designated-initializer-list , designated-initializer-clause
和,其中单个指定的初始值设定项子句的语法:s为:
designated-initializer-clause: designator brace-or-equal-initializer
,最后,指示符为:
designator: . identifier
现在,大括号或相等的初始值设定项不允许以任何方式引用同一对象的另一个指示符。此处请注意指示符与其他标识符之间的差异,例如,将结构的数据成员作为初始值设定项子句的一部分引用,或引用大括号的嵌套支撑初始化列表:s或等效初始值设定项。