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其中一个序列点是:
- 在函数调用时(无论函数是否内联),在评估所有函数参数(如果有的话)之后
发生在执行函数体中的任何表达式或语句之前 (
§1.9/17
).
那么 "evaluation of all function arguments" 是否意味着,func3()
必须在 func4()
之前调用,因为 func1()
参数的评估必须在 func2()
调用之前发生?
不,func3 和 func4 可以按任一顺序求值(但不能交错)。
它的要点是在函数调用中,X(Y, Z)
;所有 X
、Y
、Z
的计算相对于彼此的顺序不确定。唯一的排序是 Y
和 Z
是 sequenced-before 调用 X
评估的函数。
假设我们有:
typedef void (*fptr)(int, double);
fptr a();
int b();
double c();
a()(b(), c());
三个函数a
、b
、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其中一个序列点是:
- 在函数调用时(无论函数是否内联),在评估所有函数参数(如果有的话)之后
发生在执行函数体中的任何表达式或语句之前 (
§1.9/17
).
那么 "evaluation of all function arguments" 是否意味着,func3()
必须在 func4()
之前调用,因为 func1()
参数的评估必须在 func2()
调用之前发生?
不,func3 和 func4 可以按任一顺序求值(但不能交错)。
它的要点是在函数调用中,X(Y, Z)
;所有 X
、Y
、Z
的计算相对于彼此的顺序不确定。唯一的排序是 Y
和 Z
是 sequenced-before 调用 X
评估的函数。
假设我们有:
typedef void (*fptr)(int, double);
fptr a();
int b();
double c();
a()(b(), c());
三个函数a
、b
、c
可以任意顺序调用。当然,这一切都递归地应用于任何子表达式。