函数指针指向的是函数而非对象。和其它指针一样,函数指针指向某种特定类型。
函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
函数指针
(*pf)两端的括号必不可少。否则 pf 是一个返回值为 bool 指针的函数。
当把函数名作为一个值使用时,该函数自动地转换成指针。
调用函数指针
在指向不同函数类型的指针间不存在转换规则。但可以为函数指针赋一个 nullptr 或者值为 0 的整形常量表达式,表示该指针没有指向任何一个函数。
重载函数时,上下文必须清晰地界定到底应该选用哪个函数。
和数组类似,虽然不能定义函数类型的形参,但时形参可以是指向函数的指针。形参看起来时函数类型,实际上却是当成指针使用。
也可以把函数直接作为实参使用,此时它会自动转换成指针。
和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。编译器不会自动地将函数返回类型单程对应的指针类型处理,须把返回类型写成指针形式。
int (*f1(int))(int*,int);
按照由内向外的方式阅读,f1 有形参列表,所以 f1 是个函数;f1 前面有 * ,所以 f1 返回一个指针;指针的类型本身也包含形参列表,因此指针指向函数,该函数的返回类型是 int。
如果我们明确知道返回的函数是哪一个,就能使用 decltype 简化书写函数指针返回类型的过程。