在表达式left()= right()中,为什么首先对right()进行排序?

问题描述 投票:11回答:2

在C ++中,表达式left() = right()进行求值

  1. right()
  2. left()

在那个序列中。正如right()所讨论的那样,here.排在第一位

我想不出right()先行的原因。你能?我认为存在一个原因。否则,标准很难说出它的内容,但考虑一下:right()会返回一些结果。在机器代码级别,在要求right()返回之前,CPU是否不需要知道right()将返回的结果放在何处?

如果你碰巧知道标准委员会的想法(因为你在房间里或者已经阅读了备忘录),那很好:我想读你的答案。但是,我的实际问题更为温和。我想知道的是,是否存在合理的理由以及可能的原因。

c++ c++17 assignment-operator
2个回答
18
投票

除了做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]根本不会被创建。


24
投票

在引入此评估顺序的提案P0145中,作者给出了以下示例:

#include <map>
int main() {
    std::map<int, int> m;
    m[0] = m.size();
}

在这种情况下,从左到右的评估将给出1,而从右到左的评估将给出0.由于从右到左的评估,结果为0,更接近于我们的直觉,即应该分配的是在评估赋值表达式之前存在的那个。

© www.soinside.com 2019 - 2024. All rights reserved.