将1位宽的位域设置为2是指设置还是取消设置位域?

Ear*_*rlz 0 c++ bit-manipulation bit-fields c++11

所以我有一个像这样的位域:

unsigned int foobar:1;
Run Code Online (Sandbox Code Playgroud)

然后我使用此代码设置它

uint32_t code = loadCode();
structure.foobar = code & 2;
Run Code Online (Sandbox Code Playgroud)

因此,如果code设置为2,这是否意味着foobar设置为1,0或未定义?我正在使用的确切标准实际上是C++ 11,而不是简单的C.

T.C*_*.C. 7

[expr.ass]/6:

当赋值运算符的左操作数是不能表示表达式值的位字段时,位字段的结果值是实现定义的.

同样,对于初始化:

当使用无法表示的值初始化位字段时,位字段的结果值是实现定义的.

这是由DR 1816添加的.作为修复标准中的错误的缺陷报告,它实际上是追溯性的.