代码之家  ›  专栏  ›  技术社区  ›  Oded S

带有运算符重载函数的c++17求值顺序

  •  16
  • Oded S  · 技术社区  · 7 年前

    What are the evaluation order guarantees introduced by C++17?

    使用本规范

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf

    此外,我们建议以下附加规则: 顺序 涉及重载运算符的表达式的求值为 运算符,而不是函数调用的规则。

    a << b;
    operator<<(a, b);
    

    由于第二个类似于函数调用,因此参数中没有保证的求值顺序?

    1 回复  |  直到 7 年前
        1
  •  18
  •   dfrib    7 年前

    “由于第二个看起来像函数调用,因此参数中没有保证的求值顺序?”

    [expr.call]/5 包含一个示例,具体说明问题中涉及的两种情况之间的差异[ emphasis矿山 ]:

    表达式列表和任何默认参数。初始化 效应 相对于任何其他

    ...

    注意:如果使用运算符符号调用运算符函数, 参数计算按为内置函数指定的顺序排列 ; 看见 [over.match.oper] .

    struct S {
      S(int);
    };
    int operator<<(S, int);
    int i, j;
    int x = S(i=1) << (i=2);
    int y = operator<<(S(j=1), j=2);
    

    执行初始化后,的值 i 2 (参见 [expr.shift] 未指定 j 1 2. .