【问题标题】:Order of evaluation in chain invocation in C++C ++中链调用中的评估顺序
【发布时间】:2015-10-22 10:34:17
【问题描述】:

假设我们有课程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() 之前发生?

【问题讨论】:

标签: c++ operator-precedence


【解决方案1】:

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

假设我们有:

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

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

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

【讨论】:

  • 如果 XYZ 是函数调用,它们之间的顺序是不确定的(换句话说,不能像 rici 所说的那样交错),而不是未排序。
  • @BenjaminLindley 抱歉,我总是把这两个搞混
  • 好吧,你并没有完全错。在某些情况下,它们将是未排序的。例如,如果它们不是函数调用,而是对原始类型的内置操作。
【解决方案2】:

不,func3 和 func4 可以按任意顺序计算(但不能交错)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多