为什么参考模板参数不推导常量

Why is reference template argument not deducing const?

本文关键字:常量 参数 参考 为什么      更新时间:2023-10-16

我编写了以下代码,对于指针,它显示了正确的参数类型,但是当我使用引用时,它只显示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没有参考显示吗?

C++11 §5.2.8/4

"...如果type-id的类型是对可能符合cv条件的类型的引用,则typeid表达式的结果引用表示cv-nonqualible引用类型的std::type_info对象。

C++11 §5.2.8/5

" glvalue 表达式的顶级 cv 限定符或作为typeid操作数的类型 id 始终被忽略。

本质上,任何顶级const都会被删除,就像形式函数参数类型一样,生成的函数类型以及引用类型T&TCV 限定将被删除。

后者可能是为了不区分T&和只是T——它们产生相同的结果。

来自typeid参考:

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

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

(更准确地说是顶级constT当然被推导出为const int


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