C++中auto(*)(int, int)->bool里的auto(*)含义及作用解析
关于
priority_queue中auto(*)(int, int)->bool的含义解析 先看你给出的代码:
#include <vector> #include <queue> #include <functional> using namespace std; int main() { priority_queue< int, vector<int>, auto(*)(int, int)->bool > que1; priority_queue< int, vector<int>, function<bool(int, int)>> que2; return 0; }
1. auto(*)(int, int)->bool的本质
这是C++11及以后支持的函数指针类型写法,拆解来看:
(*):明确这是一个函数指针,即指向某个函数的内存地址;(int, int):限定该指针指向的函数必须接收两个int类型参数;->bool:通过尾置返回类型,指定函数的返回值为bool;auto:让编译器自动推导函数的返回值类型,这里因为->bool已经明确返回值,auto会被推导为bool,因此整个类型等价于bool(*)(int, int)——也就是“指向接收两个int、返回bool的函数的指针”类型。
2. 和function<bool(int, int)>的区别
que1的模板参数是纯函数指针类型:只能存储匹配签名的函数指针(包括无捕获的lambda,因为无捕获lambda可隐式转换为函数指针),内存开销极小,但灵活性差,无法容纳有捕获的lambda、仿函数等其他可调用对象;que2使用的std::function<bool(int, int)>是通用函数包装器:可以容纳任何符合签名的可调用对象(函数指针、任意lambda、仿函数、成员函数指针等),灵活性极强,但会有轻微的运行时开销(基于类型擦除实现)。
3. 为什么该写法能编译通过
当你用函数指针类型作为priority_queue的比较器模板参数时,默认构造会对该类型做默认初始化(函数指针默认值为nullptr)。由于你的代码中没有实际操作队列(比如插入元素),不会触发比较器的调用,因此不会出现空指针引用的编译或运行错误。
内容的提问来源于stack exchange,提问作者iouvxz
相关产品推荐
相关产品推荐

