位字段"类内初始化"导致"错误:左值作为赋值的左操作数需要左值"

iam*_*ind 16 c++ bit-fields in-class-initialization c++11

struct bitfield {
  int i = 0;  // ok
  int j : 8 = 0;  // error: lvalue required as left operand of assignment
};
Run Code Online (Sandbox Code Playgroud)

使用C++ 11"类内初始化"功能初始化位字段的正确语法是什么?

Vil*_*nen 12

这被提升为C++标准的核心问题1341,但在2015年10月被C++核心工作组拒绝为NAD("不是缺陷") - 请参阅http://open-std.org/JTC1/SC22/WG21 /docs/cwg_closed.html#1341

  • 最近也有这方面的工作,http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0187r1.pdf 已经被 Issaquah 的 EWG 审核,EWG 给出了制作新版本的方向那个提案。 (2认同)

And*_*owl 10

使用C++ 11"类内初始化"功能初始化位字段的正确语法是什么?

您无法初始化类中的位字段.C++ 11标准的第9.2段规定了类成员声明符的语法:

[...]

成员声明符:

declarator virt-specifier-seq(opt)pure-specifier(opt)

declarator brace-or-equal-initializer(opt)

identifier(opt)attribute-specifier-seq(opt):constant-expression

如您所见,位字段成员的声明符不能由大括号或等号初始化程序终止.