pae*_*bal 2 c++ standards c++14
在以下代码中:
A & getDataA() ;
B & getDataB() ;
void foo()
{
getDataA() = getDataB() ;
}
Run Code Online (Sandbox Code Playgroud)
是getDataA()保证在之前或之后进行评估getDataB(),还是评估两个操作数相对于另一个未经测序的操作数?
注意:我对引用该标准的答案感兴趣.
.
我试图理解标准来找到答案,这是我研究的结果.我的理解是对两个操作数的评估是不合理的.
但是......(每个引用来自C++ 14 draft n3797,5.17 [expr.ass]):
赋值运算符(=)和复合赋值运算符都是从右到左分组.
这意味着表达式a = b = c ;确实如此a = (b = c) ;.
在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.
第一部分说,a = b ;实际的分配将在之后进行a并b进行评估.第二部分让我感到困惑:我可以理解它operator +=(或另一个复合赋值运算符),但我无法理解operator =.
看一下章节的开头(5 Expression [expr]),我读到:
重载运算符的使用将转换为函数调用,如13.5中所述.重载运算符遵循第5章中指定的语法规则,但操作数类型,值类别和评估顺序的要求将替换为函数调用的规则.
这就是让我相信两个操作数的评估是无法排序的(函数参数的评估是无序的,除非我遗漏了一些内容),用于内置A或B不内置的情况.
但是,在上述情况下,A和B可能int,所以内置的operator =将被调用,而不是一个函数.
考虑§1.9中的这篇文章:
C++中的几个上下文导致对函数调用的评估,即使在翻译单元中没有出现相应的函数调用语法.[...]对被调用函数的执行的排序约束(如上所述)是被评估的函数调用的特征,无论调用函数的表达式的语法如何.
这特别适用于[expr]/2的以下引用(您自己也引用过):
重载操作服从在第5规定语法规则,但要求的操作数类型,值类别,和评价顺序由用于函数调用的规则代替.
假设这A是一个类,赋值是一个隐式调用operator=:
getDataA().operator=( getDataB() );
Run Code Online (Sandbox Code Playgroud)
根据[expr.call]/8的(非规范性)说明:
[ 注意:后缀表达式和参数表达式的评估都是相对于彼此的无法排序的.[...] - 结束说明 ]
规范性文本在本答案的最初引用之上,包含了这一含义:
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估是不确定的.
关于参数的评估顺序和函数调用中的后缀表达式,没有任何注意事项.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |