C++20 中的位域初始化,带有`||新国际建筑
Bit field initialization in C++20 with `|| new int` construction
我看到了关于 C++20 位域初始化的页面 https://en.cppreference.com/w/cpp/language/bit_field#Cpp20_Default_member_initializers_for_bit_fields,对于 C++20,下面的例子出现了(这里简化了):
struct S {
int z : 1 || new int { 0 };
};
页面没有解释构造|| new int
。这里有没有动态分配new int
? z
的默认值是多少,是{0}
吗?你能解释一下吗?
有两种方法可以解析这个声明:
int z : (1 || new int) { 0 };
int z : (1 || new int { 0 });
()
中的所有内容都被解释为大小说明符。由于如 cppreference 所示“选择了形成有效大小的最长标记序列”,因此假设了第二种选择。因此,通过 short-circuiting(如果第一个操作数是 true
,则不评估 ||
运算符的第二个操作数),声明等同于
int z : 1;
位字段没有默认值。
可以在 [class.mem]/9:
中找到管理此歧义解决的规则
In a member-declarator for a bit-field, the constant-expression is
parsed as the longest sequence of tokens that could syntactically form
a constant-expression.
语法上,一个constant-expression定义如下:
constant-expression:
conditional-expression
因此,不接受顶级赋值运算符,但 ?:
可以。比较链接的 cppreference 页面中的两个示例:
int x1 : 8 = 42; // OK; "= 42" is brace-or-equal-initializer
int y1 : true ? 8 : a = 42; // OK; brace-or-equal-initializer is absent
根据上述规范,分别解析为:
int x1 : (8) = 42;
int y1 : (true ? 8 : a = 42);
其中 ()
再次表示被解析为大小说明符的表达式。
我看到了关于 C++20 位域初始化的页面 https://en.cppreference.com/w/cpp/language/bit_field#Cpp20_Default_member_initializers_for_bit_fields,对于 C++20,下面的例子出现了(这里简化了):
struct S {
int z : 1 || new int { 0 };
};
页面没有解释构造|| new int
。这里有没有动态分配new int
? z
的默认值是多少,是{0}
吗?你能解释一下吗?
有两种方法可以解析这个声明:
int z : (1 || new int) { 0 };
int z : (1 || new int { 0 });
()
中的所有内容都被解释为大小说明符。由于如 cppreference 所示“选择了形成有效大小的最长标记序列”,因此假设了第二种选择。因此,通过 short-circuiting(如果第一个操作数是 true
,则不评估 ||
运算符的第二个操作数),声明等同于
int z : 1;
位字段没有默认值。
可以在 [class.mem]/9:
中找到管理此歧义解决的规则In a member-declarator for a bit-field, the constant-expression is parsed as the longest sequence of tokens that could syntactically form a constant-expression.
语法上,一个constant-expression定义如下:
constant-expression:
conditional-expression
因此,不接受顶级赋值运算符,但 ?:
可以。比较链接的 cppreference 页面中的两个示例:
int x1 : 8 = 42; // OK; "= 42" is brace-or-equal-initializer
int y1 : true ? 8 : a = 42; // OK; brace-or-equal-initializer is absent
根据上述规范,分别解析为:
int x1 : (8) = 42;
int y1 : (true ? 8 : a = 42);
其中 ()
再次表示被解析为大小说明符的表达式。