Порядок вычисления в цепочке вызова в 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 могут оцениваться в любом порядке (но не с чередованием).