C ++中链调用中的评估顺序

Order of evaluation in chain invocation in C++

假设我们有 class A:

class A {
public:
    A& func1( int ) { return *this; }
    A& func2( int ) { return *this; }
};

和 2 个独立函数:

int func3();
int func4();

现在在这段代码中:

A a;
a.func1( func3() ).func2( func4() );

是否定义了函数 func3()func4() 的求值顺序?

根据这个答案Undefined behavior and sequence points其中一个序列点是:

那么 "evaluation of all function arguments" 是否意味着,func3() 必须在 func4() 之前调用,因为 func1() 参数的评估必须在 func2() 调用之前发生?

不,func3 和 func4 可以按任一顺序求值(但不能交错)。

它的要点是在函数调用中,X(Y, Z);所有 XYZ 的计算相对于彼此的顺序不确定。唯一的排序是 YZsequenced-before 调用 X 评估的函数。

假设我们有:

typedef void (*fptr)(int, double);
fptr a();
int b();
double c();

a()(b(), c());

三个函数abc可以任意顺序调用。当然,这一切都递归地应用于任何子表达式。