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
相关产品推荐
相关产品推荐

