Код: Выделить всё
// A function with two parameters.
void AcceptTwoInts(int, int);
// Two functions that accept an integer and return another integer.
int Foo(int);
int Bar(int);
// Two functions that produce some integer.
int Baz();
int Qux();
Код: Выделить всё
AcceptTwoInts(Foo(Baz()), Bar(Qux()));
(Меня здесь не волнует правило «как если бы»; я говорю о ситуациях, в которых я могу заметить разницу.)
Причина Интересно, есть ли какая-то гарантия в этом предложении в [expr.call]/7:
Инициализация параметра, включая вычисление всех связанных значений и побочный эффект имеет неопределенную последовательность относительно любого другого параметра.
Формулировка здесь кажется двусмысленной; мне кажется, это можно интерпретировать двумя способами:
- Способ, который дает мне гарантию: учитывая аргументы A и B, либо все подвыражения связанные с A, упорядочиваются перед всеми подвыражениями, связанными с B, или наоборот.
- Способ, который не дает мне никаких гарантий: просто< /em> шаг инициализации для A и шаг инициализации для B имеют неопределенную последовательность, а не какие-либо подвыражения, которые входят в эту инициализацию.
Подробнее здесь: https://stackoverflow.com/questions/782 ... nsistently