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

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;
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

然后fun(num),T将被推断为const int.

  • 更重要的是,“num”的类型是“const int”,“num”的值的类型只是“int”。不存在“const int”类型的值(从技术上讲是纯右值)。 (2认同)