Объявление функции
Объявление функции вводит имя функции и её тип. Определение функции связывает имя/тип функции с телом функции.
Объявление функции
Объявления функций могут появляться в любой области видимости. Объявление функции в области видимости класса вводит функцию-элемент класса (если не используется спецификатор friend), подробности смотрите в функции-элементы и дружественные функции.
Тип объявляемой функции состоит из типа возвращаемого значения (предоставленного последовательностью-спецификаторов-обявления синтаксиса объявления) и декларатора функции
декларатор-не-указатель ( список-параметров ) cv (необязательно) ссылка (необязательно) except (необязательно) атрибуты (необязательно)
|
(1) | ||||||||
декларатор-не-указатель ( список-параметров ) cv (необязательно) ссылка (необязательно) except (необязательно) атрибуты (необязательно)-> завершение
|
(2) | (начиная с C++11) | |||||||
(смотрите Объявления для других форм синтаксиса декларатора)
auto.| декларатор-не-указатель | — | любой действительный декларатор, но если он начинается с *, & или &&, он должен быть заключён в круглые скобки.
| ||||||||
| список-параметров | — | возможно пустой список параметров функции, разделённых запятыми (подробности смотрите ниже) | ||||||||
| атрибуты | — | (начиная с C++11) список атрибутов. Эти атрибуты применяются к типу функции, а не к самой функции. Атрибуты для функции появляются после идентификатора в деклараторе и объединяются с атрибутами, которые появляются в начале объявления, если таковые имеются. | ||||||||
| cv | — | квалификация const/volatile, разрешена только в объявлениях нестатических функций-элемаентов | ||||||||
| ссылка | — | (начиная с C++11) ref-квалификация, разрешена только в объявлениях нестатических функций-элементов | ||||||||
| except | — |
| ||||||||
| завершение | — | Завершающий возвращаемый тип, полезен, если возвращаемый тип зависит от имен аргументов, таких как template<class T, class U> auto add(T t, U u) -> decltype(t + u); или как в auto fpif(int)->int(*)(int)
|
|
Как упоминалось в Объявлениях, за декларатором может следовать предложение requires, которое объявляет связанные ограничения для функции, которые должны быть удовлетворены, чтобы функция была выбрана при разрешении перегрузки. (пример: |
(начиная с C++20) |
Деклараторы функций можно смешивать с другими деклараторами, где позволяет последовательность-спецификаторов-объявления:
// объявляет int, int*, функцию и указатель на функцию
int a = 1, *p = NULL, f(), (*pf)(double);
// последовательность-идентификаторов-объявления это int
// декларатор f() объявляет (но не определяет)
// функцию, не принимающую аргументов и возвращающую целое число
struct S
{
virtual int f(char) const, g(int) &&; // объявляет две нестатические функции-элементы
virtual