Darf der Compiler die Auswertung von Unterausdrücken in verschiedene Funktionsargumente einbinden?

Ich frage mich über die folgende Situation:

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()));

Nach dem Lesenhttp: //en.cppreference.com/w/cpp/language/eval_orde Ich habe immer noch Schwierigkeiten zu verstehen, ob die folgende Auswertungsreihenfolge möglich ist:

x() ->y() ->a() ->b()

oder dass der Standard garantiert, dassa(x()) undb(y()) wird sozusagen als Einheit ausgewertet.

Mit anderen Worten, gibt es eine Möglichkeit, dass dies gedruckt wird

func x
func y
func a
func b

Running dieser Test auf GCC 5.4.0 gibt meiner Meinung nach logischer

func y
func b
func x
func a

aber das sagt mir natürlich nichts darüber aus, was der standard verlangt. Es wäre schön, einen Hinweis auf die Norm zu bekommen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage