Подтвердить что ты не робот

С++ указатель на функции, начальный вопрос

Я хочу спросить о указателе в С++

У меня есть простой код:

int add(int a, int b){
 return a+b;
}

int runner(int x,int y, int (*functocall)(int, int)){
 return (*functocall)(x,y);
}

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

cout<<runner(2,5,&add);

или, возможно,

cout<<runner(2,5,add);

Есть ли разница? потому что когда я попытался, результат будет таким же и без ошибок.

Спасибо большое

4b9b3361

Ответ 1

Функция будет неявно передана указателю в соответствии со стандартом С++ (4.3/1). Нет никакой разницы. Однако это преобразование никогда не применяется к нестатической функции-члену. Для них вы должны явно написать &.

Ответ 2

Нет никакой разницы. Для согласованности с другими способами получения указателя вы можете использовать &, но само имя не имеет другого смысла, поэтому предполагается, что оно означает "получить адрес".

Он очень похож на имена переменных массива, которые действуют как адрес первого элемента массива.

Ответ 3

Нет, в этом конкретном случае нет разницы. Любой из них дает вам адрес функции.

Обратите внимание, однако, что в С++ получение указателя на функцию-член требует, чтобы вы использовали '&' Оператор.

Ответ 4

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

int runner(int x,int y, int (&functocall)(int, int)){
 return functocall(x,y);
}

Теперь вызов его с помощью &add больше не будет работать, потому что вы пытаетесь привязать ссылку функции к указателю вместо функции. Иногда это светит при использовании шаблонов

template<typename T>
int runner(int x,int y, T &functocall, T otherfunc){
 return functocall(x,y) + otherfunc(y, x);
}

Теперь вызов его с помощью runner(10, 20, add, add) завершится неудачно, потому что T пытается быть выведен как на указатель функции, так и на тип функции (при переходе к эталонному параметру не происходит никакого разложения указателя!).

Ответ 5

Я считаю, что второй вызов автоматически разрешает первый вызов в компиляторе...

Ответ 6

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