我在网上看了很多,似乎很多人提到了以下规则(但我在标准中找不到),
加法运算符 +(和所有其他二元运算符)要求两个操作数都是右值,结果是右值。等等..
我检查了 C++ 标准,它明确指出(第 3.10/2 条),
每当一个泛右值出现在预期纯右值的上下文中时,该泛左值就会被转换为一个纯右值
(第 5/9 条),
每当一个泛左值表达式作为操作数的操作数出现时,该操作数需要一个纯右值,左值到右值 (4.1)、数组到指针 (4.2) 或函数到指针 (4.3) 标准转换是应用于将表达式转换为纯右值。
它使用操作数“期望”一个纯右值的术语。但是,当我研究加法运算符、乘法运算符等时,它只提到结果是纯右值,但没有说明操作数“预期”是什么。
二元运算符是否真的期望操作数是纯右值在以下情况下会有所不同,
int b = 2;
int a = b + 1;
如果b期望是prvalue,这里会有一个lvalue到rvalue的转换,然后会执行prvalue + prvalue,返回一个prvalue,结果prvalue赋值给一个lvalue a。
但是,如果 b 不需要是纯右值,它将是左值 + 纯右值,结果是纯右值。
我真的很想知道标准在哪里明确或隐含地提到了不同运营商的规则?我检查了所有操作符部分,并且只有少数标准明确提到操作数和结果应该是左值还是右值。对于大多数运算符,该标准仅提及结果而不提及操作数要求。
谢谢。
顺便说一句,我在标准 5.19 中发现关于常量表达式的内容可能非常“隐含”地暗示二元运算符需要对操作数进行左值到右值的转换。更详细的可以参考我之前的问题,
条件表达式是一个常量表达式,除非它涉及以下之一作为潜在评估的子表达式 (3.2)。
...
— 左值到右值的转换 (4.1),除非它应用于
———— 一个整数或枚举类型的左值,它引用一个非易失性的 const 对象,前面有初始化,用常量表达式初始化
谢谢阅读。