在下面的代码中,为什么调用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;
}
答案 0 :(得分:19)
参数声明为pass-by-value;然后在template argument deduction中,忽略参数的顶级const限定符。
在扣除开始之前,对P和A进行以下调整 制成:
1)如果P不是参考类型,
a)...
b)......
c)否则,如果A是cv限定类型,则为顶级cv限定符 因扣除而被忽略:
所以给定fun(num)
,模板参数T
将推断为int
,而不是const int
。
如果您将参数更改为pass-by-reference,则会保留const
部分。 e.g。
template<typename T, typename = typename enable_if<!std::is_same<int, T>::value>::type>
void fun(T& val)
然后,对于fun(num)
,T
将被推断为const int
。