我在互联网上阅读了很多文章,似乎很多人提到了以下规则(但是我在标准中找不到),
加法运算符+(以及所有其他二进制运算符)要求两个操作数均为rvalue,结果为rvalue。
等等..
我检查了C++标准,并明确指出(第3.10/2条),
(第5/9条),
它使用操作数“期望” prvalue的术语。但是,当我查看加法运算符,乘法运算符等时,它仅提及结果是prvalue,但并未说明“期望”操作数的含义。
在以下情况下,二进制运算符是否真的期望操作数为prvalue会有所不同,
int b = 2;
int a = b + 1;
如果期望b为prvalue,则此处将进行从左值到右值的转换,然后它将执行prvalue + prvalue并返回prvalue,并将结果prvalue分配给一个左值a。
但是,如果不要求b为prvalue,则它将为lvalue + prvalue,结果为prvalue。
我真的很想知道该标准在何处明确或隐含地提到了
不同运营商的规则?我检查了所有运算符部分,并且仅检查了少数几个运算符,这些标准明确提到了操作数和结果应为左值还是右值。对于大多数运算符,该标准仅提及结果,但没有提及操作数要求。
谢谢。
顺便说一句,我在标准5.19中发现关于常量表达式的内容可能非常“隐式”地暗示了二进制运算符需要对操作数进行左值到右值转换。有关更多详细信息,请参阅我之前的问题,
mixing use of constexpr and const?
谢谢阅读。
最佳答案
因此,这通常是该标准的那些推断和指定不明确的部分之一;但是,在3.10中
请注意,语言指定不当“第5节中指出了它是否期望左值操作数以及是否会产生左值”。
第5章的检查表明,列举了需要或返回左值的每种情况,但是很少列举专门处理右值的情况,因此我认为假定其余都是右值。
我还怀疑它的定义不正确,因为从标准的角度来看,如果转换是由运算符(operator)隐式或显式完成的,则不管它的行为是否一致且行为良好,这一点都不是特别重要。