R.5.2.2 Вызов функции
R.5.2.2 Вызов функции
Вызов функции является постфиксным выражением, за которым следует, возможно пустой, список выражений в скобках, разделенных запятой. Эти выражения образуют фактические параметры функции. Постфиксное выражение должно иметь тип "функция, возвращающая T", "указатель на функцию, возвращающую T" или "ссылка на функцию, возвращающую T", а результат операции вызова имеет тип "T".
При вызове функции происходит инициализация каждого формального параметра (§R.8.4.3, §R.12.8, $$r.12.1) фактическим параметром. Производятся стандартные (§R.4) и заданные пользователем (§R.12.3) преобразования типа. В функции может изменяться значения непостоянных формальных параметров, но эти изменения не могут повлиять на значения фактических параметров, кроме того случая, когда формальный параметр имеет тип ссылки без спецификации const (§R.8.2.2). Если формальный параметр имеет тип ссылки при необходимости может создаваться временная переменная (§R.7.1.6, §R.2.5,§R.2.5.4,§R.8.2.4, §R.12.2). Добавим, что возможно изменение непостоянных объектов с помощью параметров-указателей.
Функцию можно описать таким образом, что она сможет использовать меньшее число параметров (определив параметры по умолчанию §R.8.2.6) или большее число параметров (с помощью эллипсиса … §R.8.2.5), чем было указано при определении функции (§R.8.3).
Функцию можно вызвать только, если описание ее доступно в той области видимости, где происходит вызов. Отсюда следует, всякий формальный параметр, соответствующий некоторому фактическому параметру, должен быть доступен, если не считать эллипсис (…).
Перед вызовом всякий фактический параметр типа float, для которого нет формального параметра, преобразуется к типу double, а типа char, short, перечисления или битовое поле, для которого нет формального параметра, преобразуется к типу int или unsigned согласно стандартным преобразованиям целочисленных (§R.4.1). Объект, являющийся классом и не имеющий описания формального параметра, передается при вызове как структура данных.
Объект, являющийся классом и имеющий описание формального параметра передается с помощью инициализации формального параметра фактическим параметром, которая происходит перед выполнением функции посредством вызова конструктора (§R.12.2, §R.12.8).
Порядок вычислений параметров неопределен и учтите, что он может быть различен у разных трансляторов. Все побочные эффекты выражений фактических параметров могут происходить перед началом выполнения функции. Порядок вычисления постфиксных выражений и списка выражений параметров неопределен.
Допустимы рекурсивные вызовы.
Операция вызова функции порождает адрес только, если тип результата есть адрес.