专用功能模板,用于参考类型

ali*_*hoo 12 c++ templates reference-type specialization template-specialization

为什么输出这段代码:

#include <iostream>  
template<typename T> void f(T param) 
{ 
   std::cout << "General" << std::endl ; 
} 
template<> void f(int& param) 
{ 
   std::cout << "int&" << std::endl ; 
}  

int main() 
{   
  float x ;  f (x) ;   
  int y ; f (y) ;   
  int& z = y ; f (z) ; 
}  
Run Code Online (Sandbox Code Playgroud)

一般
一般
一般

第三个是令人惊讶的,因为该功能完全专门用于 int&

编辑:我知道重载可能是一个合适的解决方案.我只想学习它背后的逻辑.

Joh*_*itb 9

表达式y和表达式的类型zint.表达式中出现的引用不会保留引用类型.相反,表达式的类型将是引用的类型,表达式是左值.

因此,在两种情况下,T都推导出int,因此根本不使用显式专业化.

重要的是要注意(除了你应该真的使用重载,正如另一个人所说),你的模板中有一个非参考函数参数.在T完成对参数类型的任何推断之前,参数类型将从数组转换为指向其第一个元素的指针(对于函数,参数将转换为函数指针).因此,具有非参考函数参数的函数模板无论如何都不允许精确推导.