Rya*_*yan 8 c++ templates const template-function argument-deduction
在下面的代码中,为什么有两种调用方式fun:fun(num)和fun<const int>(num)编译时给出不同的结果?
#include <iostream>
using namespace std;
template<typename T, typename = typename enable_if<!std::is_same<int, T>::value>::type>
void fun(T val)
{
    cout << val << endl;
}
int main(void)
{
    const int num = 42;
    fun(num);  //ERROR!
    fun<const int>(num);  //Right
    return 0;
}
son*_*yao 19
该参数声明为pass-by-value; 然后在模板参数推导中,忽略参数的顶级const限定符.
在扣除开始之前,对P和A进行以下调整:
1)如果P不是参考类型,
一个) ...
b)......
c)否则,如果A是cv限定类型,则忽略顶级cv限定符以进行推导:
因此fun(num),模板参数T将被推断为int,而不是const int.
如果将参数更改为按引用传递,const则将保留该部件.例如
template<typename T, typename = typename enable_if<!std::is_same<int, T>::value>::type>
void fun(T& val)
然后fun(num),T将被推断为const int.