关于左值到右值的转换,何时需要?
我一直在互联网上阅读很多,似乎很多人提到了以下规则(但我在标准中找不到它),
加法运算符+(和所有其他二元运算符)要求两个操作数都是rvalue,结果是rvalue。
等等..
我检查了C ++标准,并明确指出(第3.10 / 2条),
每当glvalue出现在
预期prvalue的上下文,
glvalue被转换为prvalue
(第5/9条),
每当glvalue表达式出现时
作为运营商的操作数
期望该操作数的prvalue,
左值到右值(4.1),
数组到指针(4.2),或
函数到指针(4.3)标准
转换应用于转换
表达到prvalue。
它使用一个术语操作数“期望”一个prvalue。但是,当我查看加法运算符,乘法运算符等时,它只提到,结果是一个prvalue,但它没有说明操作数是“预期”的。
二元运算符是否真的期望操作数是prvalue在以下情况下会有所不同,
int b = 2;
int a = b + 1;
如果b应该是prvalue,那么这里将进行左值到右值的转换,然后它将执行prvalue + prvalue并返回一个prvalue,结果prvalue被赋值给一个左值a。
但是,如果b不需要是prvalue,则它将是lvalue + prvalue,结果是prvalue。
我真的想知道标准在哪里明确或隐含地提到了
不同运营商的规则?我检查了所有运算符部分和只有少数运算符,标准明确提到操作数和结果是左值还是右值。对于大多数运营商而言,标准仅提及结果,而不是操作数要求。
谢谢。
顺便说一下,我在标准5.19中发现关于常量表达式可能非常“隐含地”暗示二元运算符需要对操作数进行左值到右值的转换。有关详细信息,请参阅我之前的问题,
混合使用constexpr和const?
条件表达式是常量
表达除非涉及其中一个
以下是潜在的
评估子表达式(3.2)。
...
- 左值到左值的转换(4.1)
除非适用于
----一个glvalue
整数或枚举类型
指的是非易失性const对象
进行前面的初始化,
用常量表达式初始化
谢谢阅读。
没有找到相关结果
已邀请:
2 个回复
遣莫捅炭
先对冈蒲
,并且选择的
算子是内置的,表达式是格式良好的,
和
是算术类型或者算术类型可以使用,一切都很好,很好,很完美! 因此,规则§5.7-3适用。另一方面,每个操作数都是一个表达式: §5-1[注意:[...]表达式是指定计算的运算符和操作数序列。表达式可能会导致值,并可能导致副作用。 - 结束说明] 它表示一个表达式可以产生一个值,因为
表达式,如
表达式或
函数,但由于我们说
是一个完美定义的表达式!,我们可以省略动词“can”,所以我们可以确定that:表达式产生一个值。 最后一点:对于算术和逻辑内置运算符,我理解,尽管标准没有指定,但只有其操作数的值很重要,而与它们的值类别无关。 我认为使用表达式足以实现内置运算符
(和其他算术运算符),因为只有值很重要,并且可以通过表达式达到值。因此,标准没有明确定义它们。 尽管如此,这类事情的结构非常糟糕。例如,当运算符接收一个对象作为操作数而不是直接值(怀疑我正在尝试解决)时,我发现没有地方指定,如果运算符应该直接采用其值来计算运算符,如果值是评估对象的结果,依此类推。显而易见的是,只有价值观才重要,但是,这些事情的标准究竟是什么才是一种谜。