C++:用户定义的逗号运算符的求值顺序是什么?

use*_*538 7 c++ evaluation c++17

我正在阅读 Nicolai Josuttis 的《C++ 17 Completed Guide》,并遇到了以下表达式:

foo(arg1), (foo(arg2), foo(arg3));
Run Code Online (Sandbox Code Playgroud)

作者声称,内置逗号运算符的求值顺序将从左到右,但可以通过重载它们来更改。但是,我看到了有关 cppreference 的“求值顺序”文章(https://en.cppreference.com/w/cpp/language/eval_order)并发现了以下声明:

  1. 内置逗号运算符的第一个(左)参数的每个值计算和副作用都在第二个(右)参数的每个值计算和副作用之前排序。

  1. 当使用运算符表示法调用时,每个重载运算符都遵守其重载的内置运算符的排序规则。

因此,根据语句 16,cppreference 似乎声称重载的逗号运算符与其内置对应项具有相同的求值顺序。那么,作者所说的“通过重载逗号运算符,您可以更改其求值顺序”到底是什么意思,以及预期的行为到底是什么?

Pas*_* By 4

在 C++17 之前,求值顺序很混乱。C++17 对求值顺序进行了彻底的更改,这很可能只是作者的一个错误。

在 C++17 之前,重载运算符是完整的语法糖。对于任何二元运算符@a@b 相当于以下之一

operator@(a, b)
a.operator@(b)
Run Code Online (Sandbox Code Playgroud)

取决于它是成员函数还是自由函数。也就是说,ab彼此之间是无序的

在 C++17 中 的求值顺序a@b 与内置运算符 相同。对于逗号运算符,a在 之前排序b。在函数调用版本中,ab是不确定顺序的。