为什么std :: is_same为这两种类型提供了不同的结果?

时间:2018-06-15 08:56:50

标签: c++ templates const template-function argument-deduction

在下面的代码中,为什么调用funfun(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;
}

1 个答案:

答案 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