在表达式 left() = right() 中,为什么 right() 排在前面?

In the expression left() = right(), why is right() sequenced first?

在 C++ 中,表达式 left() = right() 计算

  1. right()
  2. left()

按照这个顺序。 right() 首先出现,正如

所讨论的那样

我想不出 right() 先走的理由。你是否可以?我认为这是有原因的。否则,该标准几乎不会说出它所说的内容,但请考虑:right() 将 return 一些结果。在机器代码级别,CPU 在询问 right() 到 return 之前不需要知道结果 right() 将 return 放在哪里吗?

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

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

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

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

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