在C ++中,表达式left() = right()
进行求值
right()
left()
在那个序列中。正如right()
所讨论的那样,here.排在第一位
我想不出right()
先行的原因。你能?我认为存在一个原因。否则,标准很难说出它的内容,但考虑一下:right()
会返回一些结果。在机器代码级别,在要求right()
返回之前,CPU是否不需要知道right()
将返回的结果放在何处?
如果你碰巧知道标准委员会的想法(因为你在房间里或者已经阅读了备忘录),那很好:我想读你的答案。但是,我的实际问题更为温和。我想知道的是,是否存在合理的理由以及可能的原因。
除了做Brian所展示的不直观的结果:
#include <map>
int main() {
std::map<int, int> m;
m[0] = m.size(); // before C++17 m[0] could be 0 or 1 - it was implementation defined
}
如果我们采取相同的地图,但做:
#include <map>
int main() {
std::map<int, int> m;
m[0] = Right(); // Right() may throw
}
如果Right()
抛出:
在C ++ 17之前,您可以在m[0]
(从左到右)中获得默认构造元素,或者根本不会创建m[0]
(从右到左)。在C ++ 17中,m[0]
根本不会被创建。
在引入此评估顺序的提案P0145中,作者给出了以下示例:
#include <map>
int main() {
std::map<int, int> m;
m[0] = m.size();
}
在这种情况下,从左到右的评估将给出1,而从右到左的评估将给出0.由于从右到左的评估,结果为0,更接近于我们的直觉,即应该分配的是在评估赋值表达式之前存在的那个。