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

How to initialize a bitfield inside structure declaration?

本文关键字:初始化 位域 声明 结构      更新时间:2023-10-16

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

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

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

我从clang得到的错误非常明显:

位域成员不能有类内初始化式

所以你不能这样做,你需要一个构造函数来初始化成员。

我有点惊讶,但显然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

和位域不允许有大括号或相等初始化式。但我不清楚为什么存在这种限制。这感觉就像我第一次意识到类内初始化器使类成为非聚合。

这显然是一个缺陷:

成员声明器的语法(9.2 [class.mem])不允许,但应该允许在位字段声明器上使用大括号或等号初始化式。

这个问题显然在c++ 11最终确定之前就被发现了,我们可以从实现c++ 0x的问题中看到:

  • (Richard Smith)类。位域成员不能有类内初始化式
  • 语法不允许位域成员的大括号或等号初始化式。这看起来像是监督。常量表达式后的大括号或等号初始化式似乎是明确的。

    clang behavior: clang实现了标准的字母。

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

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

    ,但显然这感觉穿过裂缝