struct SomeStruct
{
bool a : 1 = false; // compiler error
bool a = false : 1; // compiler error
} ;
在结构声明中初始化位字段的语法是什么?
答案 0 :(得分:2)
我从clang得到的错误很有说服力:
位域成员不能拥有类内初始化程序
所以你根本做不到,你需要一个初始化成员的构造函数。
答案 1 :(得分:1)
我有点惊讶,但显然Visual Studio在这里是正确的,如果我们看一下C ++ 11标准草案9.2
部分的语法,它说:
member-declarator:
declarator virt-specifier-seqopt pure-specifieropt
declarator brace-or-equal-initializeropt
identifieropt attribute-specifier-seqopt: constant-expression
并且不允许位字段具有大括号或等于初始化程序。我不清楚为什么存在这种限制。这感觉就像我第一次意识到课堂上的initializer makes a class a non-aggregate。
这显然是defect:
member-declarator(9.2 [class.mem])的语法不允许,但应该允许在位字段声明符上使用大括号或等于初始化器。
这个问题显然也是在C ++ 11最终确定之前发现的,我们可以从Issues Found Implementing C++0x看到:
- (Richard Smith)class.mem:位域成员不能拥有类内初始值设定项
醇>语法不允许 位域成员的大括号或大小写初始化程序。这似乎是一个 监督。常量表达后的支撑或等于初始化器 看似毫不含糊。
clang行为:clang实现了标准的字母。
建议的解决方案:更改语法如下:
member-declarator: identifieropt attribute-specifier-seqopt : constant-expression brace-or-equal-initializeropt
但显然这种感觉已经破裂了。