C++11 中的第 9.6/3 节非常清楚:“非常量引用不应绑定到位域。” 这个禁令背后的动机是什么?
我了解无法直接将引用绑定到位域。但如果我声明这样的事情,
struct IPv4Header {
std::uint32_t version:4, // assumes the IPv4 Wikipedia entry is correct
IHL:4,
DSCP:6,
ECN:2,
totalLength:16;
};
为什么我不能这么说?
IPv4Header h;
auto& ecn = h.ECN;
我希望底层代码实际绑定到std::uint32_t
包含我感兴趣的位的整个代码,并且我希望读写操作能够生成代码来进行适当的屏蔽。结果可能又大又慢,但在我看来它应该起作用。这将与标准所说的对const
位域的引用工作的方式一致(同样从 9.6/3 开始):
如果 const T& 类型的引用的初始值设定项是引用位域的左值,则该引用绑定到一个临时初始化以保存位域的值;引用不直接绑定到位域。
这表明写入位域是问题所在,但我不明白它是什么。我考虑了必要的掩码可能会在多线程代码中引入竞争,但是,根据 1.7/3,非零宽度的相邻位域被视为用于多线程的单个对象。在上面的示例中,IPv4Header
对象中的所有位域都将被视为单个对象,因此根据定义,尝试在读取其他字段的同时修改字段的多线程代码已经很活泼了。
我显然错过了一些东西。它是什么?