Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Specializing function template for reference types

Why is the output of this code :

#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) ; 
}  

is

General
General
General

The third one is surprizing because the function was specialized exactly for int&

Edit : I know that overloading might be a proper solution. I just want to learn the logic behind it.

like image 870
ali_bahoo Avatar asked Jan 13 '11 07:01

ali_bahoo


1 Answers

The type of both the expression y and the expression z is int. A reference appearing in an expression won't keep reference type. Instead, the type of the expression will be the referenced type, with the expression being an lvalue.

So in both cases, T is deduced to int, and thus the explicit specialization is not used at all.

What's important to note (other than that you should really use overloading, as another guy said), is that you have a non-reference function parameter in your template. Before any deduction of T against the argument type is done, the argument type will be converted from arrays to a pointer to their first element (for functions, arguments will be converted to function pointers). So a function template with a non-reference function parameter doesn't allow for accurate deduction anyway.

like image 75
Johannes Schaub - litb Avatar answered Sep 21 '22 06:09

Johannes Schaub - litb