我已经看到了其他类似的问题,并阅读了有关它的缺陷.但我仍然没有得到它.为什么i = ++i + 1在C++ 11中定义得很好i = i++ + 1?该标准如何明确定义?
通过我的工作,我在图之前有以下顺序(其中箭头表示关系之前的顺序,除非另有说明,否则一切都是值计算):
i = ++i + 1
^
|
assignment (side effect on i)
^ ^
| |
?i ++i + 1
|| ^
i+=1 |
^ 1
|
?assignment (side effect on i)
^ ^
| |
i 1
Run Code Online (Sandbox Code Playgroud)
我i用黑星标记了一个副作用,i用白星计算了一个值.这些似乎相互之间没有相应的顺序(根据我的逻辑).标准说:
如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.
缺陷报告中的解释并没有帮助我理解.左值到右值的转换与任何事情有什么关系?我弄错了什么?
我一直在互联网上阅读很多,似乎很多人提到了以下规则(但我在标准中找不到它),
加法运算符+(和所有其他二元运算符)要求两个操作数都是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;
Run Code Online (Sandbox Code Playgroud)
如果b预期是prvalue,那么这里将进行左值到右值的转换,然后它将执行prvalue + prvalue并返回一个prvalue,结果prvalue被赋值给一个左值a.
但是,如果b不需要是prvalue,则它将是lvalue + prvalue,结果是prvalue.
我真的想知道标准在哪里明确地或隐含地提到不同运营商的规则?我检查了所有运算符部分和只有少数运算符,标准明确提到操作数和结果是左值还是右值.对于大多数运营商而言,标准仅提及结果,而不是操作数要求.
谢谢.
顺便说一下,我在标准5.19中发现关于常量表达式可能非常"隐含地"暗示二元运算符需要对操作数进行左值到右值的转换.有关详细信息,请参阅我之前的问题,
条件表达式是常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2).
...
- 除非适用,否则为左值 - 右值转换(4.1)
----一个整数或枚举类型的glvalue,它引用一个带有前面初始化的非易失性const对象,用一个常量表达式初始化
谢谢阅读.