如何初始化结构声明中的位域?

时间:2015-09-21 09:19:50

标签: c++ c++11 visual-c++ syntax bit-fields

当我尝试初始化结构声明中的位字段时,MSVC ++给了我一个编译器错误:

struct SomeStruct
{
    bool a : 1 = false; // compiler error
    bool a = false : 1; // compiler error
} ;

在结构声明中初始化位字段的语法是什么?

2 个答案:

答案 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看到:

  
      
  1. (Richard Smith)class.mem:位域成员不能拥有类内初始值设定项
  2.         

    语法不允许   位域成员的大括号或大小写初始化程序。这似乎是一个   监督。常量表达后的支撑或等于初始化器   看似毫不含糊。

         

    clang行为:clang实现了标准的字母。

         

    建议的解决方案:更改语法如下:

    member-declarator:
        identifieropt attribute-specifier-seqopt : constant-expression brace-or-equal-initializeropt
    

但显然这种感觉已经破裂了。