Существуют ли указатели и ссылки на функции в C++
Что проверяют
Знаете ли вы, что функция в C++ имеет тип и адрес, и умеете ли читать сложные объявления. Попутно смотрят, отличаете ли вы указатель на свободную функцию от указателя на метод класса и от произвольного вызываемого объекта.
Как отвечать
Да, существует и то и другое.
int add(int a, int b) { return a + b; }
int (*ptr)(int, int) = add; // имя функции само распадается в адрес
int (&ref)(int, int) = add; // ссылка на функцию, она тоже есть в языке
auto* ptr2 = &add; // явное взятие адреса, то же самое
ptr(2, 3); // разыменование писать не обязательно
(*ptr)(2, 3);
ref(2, 3);Разница практическая: указатель можно переприсвоить и обнулить, ссылку нельзя, она обязана быть инициализирована при объявлении и всегда обозначает валидную функцию. Поэтому в параметрах обычно встречается указатель, а ссылка на функцию нужна редко: в шаблонах и там, где хочется гарантии, что вызывать есть что.
Отдельно проговорите, что указатель на функцию-член это другой тип: int (C::*m)(int), вызывается через .* или ->*, потому что нужен ещё и объект. И что современный код чаще берёт не сырой указатель, а std::function (принимает любой вызываемый объект ценой косвенного вызова и возможного выделения памяти) или шаблонный параметр, который инлайнится.
Для читаемости полезно показать псевдоним: using Fn = int(int, int); и дальше Fn* p = add; или Fn& r = add;.
Где спотыкаются
Утверждают, что ссылок на функции в C++ нет, и в доказательство показывают int (*&r)(int, int) = ptr;. Это ссылка на указатель, совсем другая сущность, а настоящая ссылка на функцию пишется без звёздочки.
Второе: теряются в объявлении. Без скобок int *f(int, int); это функция, возвращающая указатель на int, а не указатель на функцию. Скобки вокруг звёздочки обязательны, и именно на них разваливается чтение сигнатур вслух.
Третье: пытаются положить в указатель на функцию лямбду с захватом. Лямбда без захвата неявно приводится к указателю, с захватом нет: ей нужно хранить состояние, и для этого существуют std::function или шаблон.