Порядок вычисления в цепочке вызова в C++

Допустим, у нас есть класс 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() определены?

Согласно этому ответу Неопределенное поведение и точки последовательности одной из точек последовательности являются:

  • при вызове функции (независимо от того, является ли функция встроенной), после оценки всех аргументов функции (если таковые имеются), которая происходит до выполнения каких-либо выражений или операторов в теле функции (§1.9/17).

Так значит "оценка всех аргументов функции" означает, func3() должен быть вызван раньше func4() в качестве оценки func1() аргументы должны произойти до вызова func2()?

2 ответа

Решение

Суть в том, что в вызове функции, 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 можно вызывать в любом порядке. Конечно, все это применимо рекурсивно к любым подвыражениям.

Нет, func3 и func4 могут оцениваться в любом порядке (но не с чередованием).

Другие вопросы по тегам