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

C++模板参数推导机制:编译器如何在未知foo的T类型时调用bar?

编译器如何在未明确foo函数模板参数T类型的情况下,决定调用bar函数?

通常调用foo(2)时,编译器会根据实参2推导出T为int类型。而在本示例中,T的推导基于foo被传入的bar函数的参数类型。

#include <iostream>

template<typename T>
void foo(const T& a_) {
    std::cout << a_<< std::endl;
}

void bar(void (*ptr) (const int&)) {
    std::cout << "bar called" << std::endl;
}

int main() {
    bar(foo);
}

推导过程解析

这是C++模板实参推导里语境推导的典型场景,编译器会通过目标函数bar的参数类型反向推导模板函数foo的参数:

  • 先明确bar的参数要求:它接受一个类型为void (*)(const int&)的函数指针,也就是指向「接收const int&参数、返回void的函数」的指针。
  • 模板函数foo的签名是template<typename T> void foo(const T&),要让foo能匹配bar的参数,编译器需要找到一个T,使得实例化后的foo<T>签名和bar要求的函数指针类型完全一致。
  • 对比参数类型:bar要求的参数是const int&,foo<T>的参数是const T&,因此编译器直接推导出T必须为int,此时foo<int>的签名正好是void foo(const int&),完全符合bar的参数要求。
  • 最终编译器会自动实例化foo<int>,并将该函数的地址传入bar,程序运行后输出bar called。

内容的提问来源于stack exchange,提问作者Vivek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:10:13