¿Se le permite al compilador entrelazar la evaluación de subexpresiones dentro de diferentes argumentos de función?
Me pregunto sobre la siguiente situación:
void f(int a, int b) { }
int a(int x) { std::cout << "func a" << std::endl; return 1; }
int b(int x) { std::cout << "func b" << std::endl; return 2; }
int x() { std::cout << "func x" << std::endl; return 3; }
int y() { std::cout << "func y" << std::endl; return 4; }
f(a(x()), b(y()));
Despues de leerhttp://en.cppreference.com/w/cpp/language/eval_order Todavía tengo dificultades para entender si es posible el siguiente orden de evaluación:
x()
->y()
->a()
->b()
o que la norma garantiza quea(x())
yb(y())
serán evaluados como unidades, por así decirlo.
En otras palabras, ¿hay alguna posibilidad de que esto se imprima
func x
func y
func a
func b
Ejecutar esta prueba en GCC 5.4.0 me da más lógica.
func y
func b
func x
func a
pero esto, por supuesto, no me dice nada sobre lo que requiere el estándar. Sería bueno obtener una referencia al estándar.