Ответ 1
Функция будет неявно передана указателю в соответствии со стандартом С++ (4.3/1). Нет никакой разницы. Однако это преобразование никогда не применяется к нестатической функции-члену. Для них вы должны явно написать &
.
Я хочу спросить о указателе в С++
У меня есть простой код:
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);
Есть ли разница? потому что когда я попытался, результат будет таким же и без ошибок.
Спасибо большое
Функция будет неявно передана указателю в соответствии со стандартом С++ (4.3/1). Нет никакой разницы. Однако это преобразование никогда не применяется к нестатической функции-члену. Для них вы должны явно написать &
.
Нет никакой разницы. Для согласованности с другими способами получения указателя вы можете использовать &
, но само имя не имеет другого смысла, поэтому предполагается, что оно означает "получить адрес".
Он очень похож на имена переменных массива, которые действуют как адрес первого элемента массива.
Нет, в этом конкретном случае нет разницы. Любой из них дает вам адрес функции.
Обратите внимание, однако, что в С++ получение указателя на функцию-член требует, чтобы вы использовали '&' Оператор.
Обратите внимание, что вы можете иметь ссылки на функции
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
пытается быть выведен как на указатель функции, так и на тип функции (при переходе к эталонному параметру не происходит никакого разложения указателя!).
Я считаю, что второй вызов автоматически разрешает первый вызов в компиляторе...
это потому, что такого объекта (в терминах выражений) нет как функция, существуют только указатели на функции. Когда вы хотите передать функцию своей функции, единственное, что вы можете передать, - это указатель, поэтому компилятор делает это для вас.