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

时间:2015-07-30 21:33:15

标签: c++ operator-precedence

我们说我们上课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()参数进行评估?

2 个答案:

答案 0 :(得分:6)

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

假设我们有:

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

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

可以按任何顺序调用三个函数abc。当然,这都适用于任何子表达式。

答案 1 :(得分:3)

不,func3和func4可以按任意顺序进行评估(但不是交错的)。