为什么引用模板参数不能推导const?

时间:2016-05-24 11:28:16

标签: c++ templates reference type-deduction

我已经编写了以下代码,并且对于指针显示正确的参数类型,但是当我使用引用时,它只显示int而没有const。为什么呢?

template <typename T>
void increment(T& x)
{
    std::cout << "Argument type is : " << typeid(x).name() << std::endl;
    //x = x + 1;
}

template <typename T>
void increment(T* x)
{
    std::cout << "Argument type is : " << typeid(x).name() << std::endl;
    //x = x + 1;
}  

int main()
{
    const int x = 0;
    const int y = x;
    increment(x);
    increment(&y);
}

输出:

Argument type is : int 
Argument type is : int const *

请您解释为什么const未显示参考?

2 个答案:

答案 0 :(得分:4)

C ++11§5.2.8/ 4
  

...如果 type-id 的类型是对可能 cv - 限定类型的引用,则{的结果{1}}表达式引用表示 cv - 未限定引用类型的typeid对象。 ...

C ++11§5.2.8/ 5
  

glvalue表达式的顶级 cv - 限定符或 type-id 是{{1}的操作数总是被忽略。

基本上,任何顶级std::type_info都被删除,就像正式函数参数类型wrt一样。生成的函数类型以及引用类型typeidconst cv 限定条件将被删除。

后者可能是为了不区分TT& - 它们会产生相同的结果。

答案 1 :(得分:2)

来自typeid reference

  

如果type是引用类型,则结果引用表示引用类型的std::type_info对象。

  

在所有情况下,typeid都会忽略cv限定符(即typeid(T)==typeid(const T)

(更确切地说,顶级constT当然被推断为const int

标准段落为[expr.typeid]/4[expr.typeid]/5

相关问题