Пространства имён
Варианты
Действия

Объявление функции

Материал из cppreference.com
 
 
 
Функции
Общее
Категории значений (lvalue, rvalue, xvalue)
Порядок оценки (sequence points)
Константные выражения
Потенциально оцениваемые выражения
Первичные выражения
Лямбда-выражения(C++11)
Литералы
Целочисленные литералы
Литералы с плавающей запятой
Логические литералы
Символьные литералы включая управляющие последовательности
Строковые литералы
Литерал нулевого указателя(C++11)
Пользовательский литерал(C++11)
Операторы
a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
++a, --a, a++, a--
+a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
a||b, a&&b, !a
a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
a[b], *a, &a, a->b, a.b, a->*b, a.*b
a(...), a,b, a?b:c
Выражение new
Выражение delete
Выражение throw
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
Выражения свёртки(C++17)
Альтернативные представления операторов
Приоритет и ассоциативность
Перегрузка операторов
Сравнение по умолчанию(C++20)
Преобразования
Неявные преобразования
const_cast
static_cast
reinterpret_cast
dynamic_cast
Явные преобразования: (T)a, T(a)
Пользовательское преобразование
 

Объявление функции вводит имя функции и её тип. Определение функции связывает имя/тип функции с телом функции.

Объявление функции

Объявления функций могут появляться в любой области видимости. Объявление функции в области видимости класса вводит функцию-элемент класса (если не используется спецификатор friend), подробности смотрите в функции-элементы и дружественные функции.

Тип объявляемой функции состоит из типа возвращаемого значения (предоставленного последовательностью-спецификаторов-обявления синтаксиса объявления) и декларатора функции

декларатор-не-указатель ( список-параметров ) cv (необязательно) ссылка (необязательно) except (необязательно) атрибуты (необязательно) (1)
декларатор-не-указатель ( список-параметров ) cv (необязательно) ссылка (необязательно) except (необязательно) атрибуты (необязательно)-> завершение (2) (начиная с C++11)

(смотрите Объявления для других форм синтаксиса декларатора)

1) Синтаксис декларатора обычной функции.
2) Объявление завершающего возвращаемого типа. Последовательность-спецификаторов-обявления в этом случае должна содержать ключевое слово auto.
декларатор-не-указатель любой действительный декларатор, но если он начинается с *, & или &&, он должен быть заключён в круглые скобки.
список-параметров возможно пустой список параметров функции, разделённых запятыми (подробности смотрите ниже)
атрибуты (начиная с C++11) список атрибутов. Эти атрибуты применяются к типу функции, а не к самой функции. Атрибуты для функции появляются после идентификатора в деклараторе и объединяются с атрибутами, которые появляются в начале объявления, если таковые имеются.
cv квалификация const/volatile, разрешена только в объявлениях нестатических функций-элемаентов
ссылка (начиная с C++11) ref-квалификация, разрешена только в объявлениях нестатических функций-элементов
except

спецификация динамического исключения

(до C++11)

либо спецификация динамического исключения,
либо спецификация noexcept

(начиная с C++11)
(до C++17)

спецификация noexcept

(начиная с C++17)

Обратите внимание, что спецификация исключения не является частью типа функции

(до C++17)
завершение Завершающий возвращаемый тип, полезен, если возвращаемый тип зависит от имен аргументов, таких как template<class T, class U> auto add(T t, U u) -> decltype(t + u); или как в auto fpif(int)->int(*)(int)


Как упоминалось в Объявлениях, за декларатором может следовать предложение requires, которое объявляет связанные ограничения для функции, которые должны быть удовлетворены, чтобы функция была выбрана при разрешении перегрузки. (пример: void f1(int a) requires true;) Обратите внимание, что связанное ограничение является частью сигнатуры функции, но не частью типа функции.

(начиная с C++20)

Деклараторы функций можно смешивать с другими деклараторами, где позволяет последовательность-спецификаторов-объявления:

// объявляет int, int*, функцию и указатель на функцию
int a = 1, *p = NULL, f(), (*pf)(double);
// последовательность-идентификаторов-объявления это int
// декларатор f() объявляет (но не определяет)
//                функцию, не принимающую аргументов и возвращающую целое число

struct S
{
    virtual int f(char) const, g(int) &&; // объявляет две нестатические функции-элементы
    virtual