Если вы хотите иметь возможность назначить указатель на функцию, а затем изменить то, на что указывает этот указатель, используйте auto fp = func
. Если нет, то используйте ссылку auto& rp = func
, так как вы не можете переназначить его:
#include <iostream>
using namespace std;
int funcA(int i, int j) {
return i+j;
}
int funcB(int i, int j) {
return i*j;
}
int main(int argc, char *argv[]) {
auto fp = funcA;
auto& rp = funcA;
cout << fp(1, 2) << endl; // 3 (1 + 2)
cout << rp(1, 2) << endl; // 3 (1 + 2)
fp = funcB;
//rp = funcB; // error: assignment of read-only reference 'rp'
cout << fp(1, 2) << endl; // 2 (1 * 2)
return 0;
}
Я пытался придумать более практический пример того, почему кто-то когда-нибудь сделать это, ниже код, который использует массив указателей вызова функции на основе пользовательского ввода (любой элемент arr
также может быть изменен во время выполнения, чтобы указать на другую функцию):
#include <iostream>
using namespace std;
void funcA(int i, int j) {
std::cout << "0: " << i << ", " << j << endl;
}
void funcB(int i, int j) {
std::cout << "1: " << i << ", " << j << endl;
}
void funcC(int i, int j) {
std::cout << "2: " << i << ", " << j << endl;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
cout << "Usage: ./a.out <val>" << endl;
exit(0);
}
int index = atoi(argv[1]);
if (index < 0 || index > 2) {
cout << "Out of bounds" << endl;
exit(0);
}
void(* arr[])(int, int) = { funcA, funcB, funcC };
arr[index](1, 2);
return 0;
}
Внутренние представления одинаковы, но значения уровня языка совершенно разные. – texasbruce
«Язык синтаксического сахара» языка позволяет использовать их с идентичным синтаксисом. Но семантически они разные. Например, 'auto & func2 = & someFunc;' не будет компилироваться, а 'auto func1 = & someFunc;' будет. Хотя использование 'auto' в этом контексте будет только запутывать разницу. – AnT