如何在结构声明中初始化位域
How to initialize a bitfield inside structure declaration?
当我尝试在结构声明中初始化位字段时,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
,但显然这感觉穿过裂缝
相关文章:
- 在类函数中初始化外部作用域变量
- 枚举位域和聚合初始化
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 预 C++20 位字段零初始化
- 从 C++ 中的位表示形式初始化字符
- 无法初始化以 std::byte 作为成员类型的位字段
- 访问位域联合是C++标准中常见的初始数据未定义行为
- 如何在C 中初始化位板
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 导致IAR ARM中出现错误的成员结构位字段元素的Initializer列表初始化
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化
- 使用作用域内生成的指针初始化静态成员
- 主线程中块作用域static与命名空间作用域thread_local的初始化和销毁顺序
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 我需要初始化位吗?
- 如何在Qt(gcc 64位)中禁用自动初始化局部变量
- Visual Studio 2010 SP1 中的 64 位整数初始化错误
- 可以使用字符串从 STL 重新初始化位集
- 初始化空白位域有什么用
- 如何在结构声明中初始化位域