В C++ все подвыражения аргументов вызова функции последовательно упорядочены?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 В C++ все подвыражения аргументов вызова функции последовательно упорядочены?

Сообщение Anonymous »

Рассмотрим ситуацию, когда у нас есть следующие функции:

Код: Выделить всё

// 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()));
Мой вопрос: Является ли вызов Baz последовательным (даже неопределенным) относительно вызова Qux? Я интересно, могу ли я предположить что-нибудь о том, были ли вычислены все подвыражения для одного аргумента к тому времени, когда мы начинаем оценивать подвыражения для другого аргумента, независимо от того, какой порядок компилятор выбирает для этих двух аргументов.
(Меня здесь не волнует правило «как если бы»; я говорю о ситуациях, в которых я могу заметить разницу.)

Причина Интересно, есть ли какая-то гарантия в этом предложении в [expr.call]/7:

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

Формулировка здесь кажется двусмысленной; мне кажется, это можно интерпретировать двумя способами:
  • Способ, который дает мне гарантию: учитывая аргументы A и B, либо все подвыражения связанные с A, упорядочиваются перед всеми подвыражениями, связанными с B, или наоборот.
  • Способ, который не дает мне никаких гарантий: просто< /em> шаг инициализации для A и шаг инициализации для B имеют неопределенную последовательность, а не какие-либо подвыражения, которые входят в эту инициализацию.
Какая интерпретация правильная? Другими словами, является ли вызов Baz «вычислением значения» относительно инициализации первого параметра AcceptTwoInts?

Подробнее здесь: https://stackoverflow.com/questions/782 ... nsistently
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»