Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Гарантирован ли порядок вычисления аргументов в вызове функции?

#cpp #c #функции


К примеру, у меня есть такой вызов функции:

std::unique_ptr tmp{new MyClassWithNameFunction};
foo(tmp->name(), std::move(tmp));


Гарантировано ли, что вызов метода name() будет происходить первым?
    


Ответы

Ответ 1



Порядок вычисления аргументов в вызове функции — это пример неуточняемого поведения (англ. unspecified behavior). Такое поведение зависит от реализации (компилятора), но реализация свой выбор поведения документировать не должна. Кстати говоря, порядок вычисления аргументов необязательно должен быть справа-налево или слева-направо. Более того, при вызове разных функций он может быть разным.

Ответ 2



Нет, не гарантирован. Более того, большинство компиляторов наоборот будут вычислять аргументы справа налево.

Ответ 3



Стандарт. There is a sequence point after the evaluations of the function designator and the actual arguments but before the actual call. Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function. In other words, function executions do not ‘‘interleave’’ with each other. EXAMPLE In the function call (*pf[f1()]) (f2(), f3() + f4()) the functions f1, f2, f3, and f4 may be called in any order. All side effects have to be completed before the function pointed to by pf[f1()] is called. Перевод. Существует точка последовательности после вычисления функции и фактических аргументов, но перед фактическим вызовом. Каждое вычисление в вызывающей функции (включая вызовы других функций), которая иначе специально не упорядочена до или после выполнения тела вызываемой функции, определяется неопределенным образом по отношению к выполнению вызываемой функции. Другими словами, выполнение функций не «перемежается» друг с другом. Пример В вызове функции (*pf[f1()]) (f2(), f3() + f4()) функции f1, f2, f3 и f4 могут вызываться в любом порядке. Все побочные эффекты должны быть завершены до вызова функции, на которую указывает pf[f1()].

Комментариев нет:

Отправить комментарий