【问题标题】:In the expression left() = right(), why is right() sequenced first?在表达式 left() = right() 中,为什么 right() 排序在前?
【发布时间】:2019-08-18 14:27:19
【问题描述】:

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

  1. right()
  2. left()

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

我想不出有什么理由让right() 先上。你可以吗?我想是有原因的。否则,标准几乎不会说出它所说的内容,但请考虑:right() 将返回一些结果。在机器代码级别,CPU 不需要知道将结果放在哪里 right() 会在要求 right() 返回之前返回它吗?

如果您碰巧知道标准委员会的想法(因为您当时在会议室中或已阅读备忘录),那就太好了:我想阅读您的回答。但是,我的实际问题更为温和。我只想知道是否存在一个似是而非的理由,以及这个理由可能是什么。

【问题讨论】:

    标签: c++ c++17 assignment-operator


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 2019-01-17
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多