Неявное приведение от функции к указателю на функцию? - PullRequest
0 голосов
/ 25 января 2019

У меня есть функция, которая принимает в качестве аргумента указатель на функцию. Удивительно, но я могу передать как указатель функции, так и обычную функцию:

#include <iostream>
#include <functional>

int triple(int a) {
    return 3*a;
}

int apply(int (*f)(int), int n) {
    return f(n);
}

int main() {
    std::cout << apply(triple, 7) << "\n";
    std::cout << apply(&triple, 7) << "\n";
}

Я не понимаю, почему это работает. Есть ли неявное преобразование из функций в указатели на функции?

1 Ответ

0 голосов
/ 25 января 2019

Да, есть неявное преобразование функции в указатель :

Значение l типа функции T может быть неявно преобразовано в prvalue указатель на эту функцию .Это не относится к нестатическим функциям-членам, так как l-значений, которые ссылаются на нестатические функции-члены, не существует.

И

Указатель на функцию можно инициализироватьс адресом функции, не являющейся членом или статической функции-члена.Из-за неявного преобразования функции в указатель оператор address-of является необязательным:

void f(int);
void (*p1)(int) = &f;
void (*p2)(int) = f; // same as &f

Это означает, что при использовании в контексте, требующем указателя на функцию, функция (за исключением нестатическихфункция-член) неявно преобразуется в указатель на функцию, и использование operator& необязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...