¿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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta