Если у нас есть три функции (нечто, панель и baz), которые составлены как так...
foo(bar(), baz())
Есть ли гарантия по стандарту C++, что панель будет оценена прежде baz?
Нет, такой гарантии нет. Он не определен в соответствии со стандартом C ++.
Бьярн Страуструп также прямо говорит об этом в разделе 6.2.2 3-го издания «Язык программирования C ++» с некоторыми соображениями:
Более качественный код может быть сгенерирован в отсутствие ограничений на выражение порядок оценки
Хотя технически это относится к более ранней части того же раздела, в которой говорится, что порядок оценки частей выражения также не указан, то есть
int x = f(2) + g(3); // unspecified whether f() or g() is called first
Для bar() и baz() не указан порядок - единственное, что сказано в стандарте, это то, что они оба будут оценены до вызова foo(). Из Стандарта C++, раздел 5.2.2/8:
Порядок оценки аргументов не определен.
Из [5.2.2] Вызов функции,
Порядок оценки аргументов не определен. Все побочные эффекты оценок выражений аргументов вступают в силу до ввода функции.
Поэтому нет гарантии, что bar()
будет запущен раньше baz()
, только то, что bar()
и baz()
будут вызваны раньше foo
.
Также обратите внимание из [5] Выражения, что:
за исключением случаев, когда это указано [например, специальные правила для
&&
и||
], порядок оценки операндов отдельных операторов и подвыражений отдельных выражений, а также порядок возникновения побочных эффектов не определен.
поэтому даже если вы спрашиваете, будет ли bar()
выполняться перед baz()
в foo(bar() + baz())
, порядок все равно не определен.