我正在阅读有关逗号运算符(N3797 :: 5.18 [expr.comma]
)并且遇到以下内容:
结果的类型和值是权利的类型和值 操作数;结果与其右边的值类别相同 操作数,如果右操作数是一个glvalue和一个,则是一个位字段 位字段。
一个表达式如何引用一个位字段才能成为非glvalue?
struct A
{
unsigned int a : 3;
}
A a{7};
int main()
{
++a.a;
std::cout << a.a; //0
}
答案 0 :(得分:0)
免责声明:此答案似乎在发布的确切时间和日期有效。未来的读者不应该依赖其有效性而不检查链接的源本身是否有更新进展
关于可能发生prvalue位域的段落误导性提示存在一个悬而未决的问题,precisely 1925:
根据5.18 [expr.comma]第1段,
结果的类型和值是右操作数的类型和值;结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则为位字段。
位域结果的描述似乎表明操作数可能不是glvalue但仍可能是位字段。似乎没有对prvalue位字段的规范性禁止,因此应该添加一个,并且应该调整这个措辞以消除可能存在这样的事情的建议。
在撰写本文时,状态为起草,因此我相信需要进行一些额外的迭代才能更改。此外,clang's 1925 in the defect report目前还将此列为“未解决”。