代码之家  ›  专栏  ›  技术社区  ›  Serge Rogatch

如何初始化结构声明中的位字段?[副本]

  •  1
  • Serge Rogatch  · 技术社区  · 9 年前

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

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

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   Some programmer dude    9 年前

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

    位域成员不能有类内初始值设定项

    所以你根本无法做到这一点,你需要一个初始化成员的构造函数。

        2
  •  1
  •   Community CDub    8 年前

    我有点惊讶,但显然Visual Studio在这里是正确的,如果我们从第节中查看语法 9.2 在C++11标准草案中,它说:

    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 :

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

    这个问题显然也在C++11最终确定之前被发现,我们可以从 Issues Found Implementing C++0x :

    1. (理查德·史密斯)班。mem:位域成员不能有类内初始化器

    语法不允许 位字段成员的大括号或相等初始值设定项。这看起来像是 疏忽常量表达式后的大括号或相等初始值设定项 似乎是明确的。

    clang行为:clang执行标准的字母。

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

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

    但很明显,这种感觉穿透了裂缝。