Порядок оценки в параметрах функции C++

Если у нас есть три функции (нечто, панель и baz), которые составлены как так...

foo(bar(), baz())

Есть ли гарантия по стандарту C++, что панель будет оценена прежде baz?

82
задан Clark Gaebel 29 May 2010 в 11:55
поделиться

3 ответа

Нет, такой гарантии нет. Он не определен в соответствии со стандартом C ++.

Бьярн Страуструп также прямо говорит об этом в разделе 6.2.2 3-го издания «Язык программирования C ++» с некоторыми соображениями:

Более качественный код может быть сгенерирован в отсутствие ограничений на выражение порядок оценки

Хотя технически это относится к более ранней части того же раздела, в которой говорится, что порядок оценки частей выражения также не указан, то есть

int x = f(2) + g(3);   // unspecified whether f() or g() is called first
91
ответ дан 24 November 2019 в 09:16
поделиться

Для bar() и baz() не указан порядок - единственное, что сказано в стандарте, это то, что они оба будут оценены до вызова foo(). Из Стандарта C++, раздел 5.2.2/8:

Порядок оценки аргументов не определен.

20
ответ дан 24 November 2019 в 09:16
поделиться

Из [5.2.2] Вызов функции,

Порядок оценки аргументов не определен. Все побочные эффекты оценок выражений аргументов вступают в силу до ввода функции.

Поэтому нет гарантии, что bar() будет запущен раньше baz(), только то, что bar() и baz() будут вызваны раньше foo.

Также обратите внимание из [5] Выражения, что:

за исключением случаев, когда это указано [например, специальные правила для && и ||], порядок оценки операндов отдельных операторов и подвыражений отдельных выражений, а также порядок возникновения побочных эффектов не определен.

поэтому даже если вы спрашиваете, будет ли bar() выполняться перед baz() в foo(bar() + baz()), порядок все равно не определен.

17
ответ дан 24 November 2019 в 09:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: