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