我们说我们上课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
)中的任何表达式或语句之前发生。"评估所有函数参数"是的,func3()
必须在func4()
之前调用,因为在调用func1()
之前必须对func2()
参数进行评估?
答案 0 :(得分:6)
它的要点是在函数调用中X(Y, Z)
;所有X
,Y
,Z
的评估都是相对于彼此不确定的。唯一的排序是Y
和Z
排序 - 在调用X
评估的函数之前。
假设我们有:
typedef void (*fptr)(int, double);
fptr a();
int b();
double c();
a()(b(), c());
可以按任何顺序调用三个函数a
,b
,c
。当然,这都适用于任何子表达式。
答案 1 :(得分:3)
不,func3和func4可以按任意顺序进行评估(但不是交错的)。