[英]c++17 evaluation order with operator overloading functions
关于这个问题
有了这个规范
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf
而这篇文章来自规范
此外,我们建议使用以下附加规则: 涉及重载运算符的表达式的求值顺序由与相应内置运算符关联的顺序确定,而不是函数调用的规则。
这是否意味着这两个表达式不再相同?
a << b;
operator<<(a, b);
由于第二个看起来像一个函数调用,因此参数中没有保证的评估顺序?
“由于第二个看起来像一个函数调用,因此参数中没有保证的评估顺序?”
确实。 [expr.call] / 5包含一个示例,专门介绍了您的问题所涵盖的两个案例之间的区别[ 强调我的 ]:
后缀表达式在表达式列表中的每个表达式和任何默认参数之前进行排序。 参数的初始化(包括每个相关的值计算和副作用) 相对于任何其他参数的初始化是不确定的 。
...
注意:如果使用运算符表示法调用运算符函数,则根据内置运算符的指定对参数求值进行排序 。 见[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
。- 结束例子]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.