【问题标题】:c++17 evaluation order with operator overloading functions带有运算符重载函数的 c++17 求值顺序
【发布时间】:2018-03-06 14:06:58
【问题描述】:

关于这个问题

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);

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

【问题讨论】:

  • 没错,两种不同的语法现在有不同的语义。运算符语法有其特殊的语义,函数调用语法有(新的!)函数调用语义。
  • @KerrekSB 这正是这个提议的原因:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0431r0.htm 是写出来的,但我不相信它有任何吸引力。
  • @ForeverLearning:这当然是一个能激发心灵、思想和建议的主题!

标签: c++ language-lawyer standards c++17


【解决方案1】:

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

确实如此。 [expr.call]/5 包含一个示例,专门涵盖了您的问题所涵盖的两种情况之间的区别 [emphasis mine]:

后缀表达式在每个表达式之前排序 表达式列表和任何默认参数。的初始化 参数,包括每个相关的值计算和边 效果,相对于任何其他的顺序是不确定的 参数

...

注意:如果使用运算符表示法调用运算符函数, 参数评估按照内置函数的指定排序 运营商;看 [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的值是否为 12

— 结束示例 ]

【讨论】:

猜你喜欢
  • 2011-11-03
  • 2012-01-07
  • 2020-01-31
  • 2021-07-12
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多