You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:12:33