【问题标题】:How to initialize a bitfield inside structure declaration? [duplicate]如何在结构声明中初始化位域? [复制]
【发布时间】:2015-09-21 09:19:49
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

我从 clang 得到的错误很能说明问题:

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

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

【讨论】:

  • 谢谢。 MSVC++ 比较抱怨;。实际上,这是 C++11 中的一个已知问题:open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#1341
  • @SergeRogatch: 也许是“已知”,但显然没有引起任何兴趣:-(
  • 虽然 clang 往往更符合标准,但它也存在错误,并且在某些情况下 clang 是不正确的。我之前已经提交了几个基于 SO 问题的 clang、gcc 和 Visual Studio 错误。
【解决方案2】:

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

位域不允许有brace-or-equal-initializer。我不清楚为什么存在这种限制。这感觉就像我第一次意识到课堂上的initializer makes a class a non-aggregate

这显然是defect

member-declarator (9.2 [class.mem]) 的语法不允许但应该允许在位域声明符上使用大括号或等号初始化器。

正如我们从Issues Found Implementing C++0x 看到的那样,这个问题显然在 C++11 完成之前也被发现了:

  1. (Richard Smith) class.mem:位域成员不能有类内初始化器

语法不允许 位域成员的大括号或相等初始化器。这似乎是一个 监督。常量表达式后的大括号或等号初始化器 似乎是明确的。

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

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

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

但显然这种感觉是通过裂缝。

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多