reference for bit fields at cppreference给出以下示例:
#include <iostream> struct S { // three-bit unsigned field, // allowed values are 0...7 unsigned int b : 3; }; int main() { S s = {7}; ++s.b; // unsigned overflow (guaranteed wrap-around) std::cout << s.b << '\n'; // output: 0 }
强调保证的环绕式注释。
但是,WG21 CWG Issue 1816描述了一些不清楚的位字段值规范的问题,而[expr.post.incr]/1描述了最新的标准草案状态:
后缀++表达式的值是其操作数的值。 ...
如果操作数是不能表示增量值的位域,则该位域的结果值由实现定义。
但是,我不确定这是否也适用于无符号位域的环绕。
答案 0 :(得分:8)
[expr.pos]/1
和[expr.ass]/6
都同意在(有符号或无符号)位字段上定义整数溢出。
[expr.pos]/1
[...]如果操作数是不能表示增量值的位域,则该位域的结果值是实现定义的。
[expr.ass]/6
当赋值运算符的左操作数是一个不能表示表达式值的位字段时,该位字段的结果值将由实现定义。
我已经修复了cppreference页面。谢谢您的注意。