我已经编写了以下代码,并且对于指针显示正确的参数类型,但是当我使用引用时,它只显示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
未显示参考?
答案 0 :(得分:4)
C ++11§5.2.8/ 5“ ...如果 type-id 的类型是对可能 cv - 限定类型的引用,则{的结果{1}}表达式引用表示 cv - 未限定引用类型的
typeid
对象。 ...
“ glvalue表达式的顶级 cv - 限定符或 type-id 是{{1}的操作数总是被忽略。
基本上,任何顶级std::type_info
都被删除,就像正式函数参数类型wrt一样。生成的函数类型以及引用类型typeid
中const
的 cv 限定条件将被删除。
后者可能是为了不区分T
和T&
- 它们会产生相同的结果。
答案 1 :(得分:2)
如果type是引用类型,则结果引用表示引用类型的
std::type_info
对象。
和
在所有情况下,typeid都会忽略cv限定符(即
typeid(T)==typeid(const T)
)
(更确切地说,顶级const
)T
当然被推断为const int
。
标准段落为[expr.typeid]/4
和[expr.typeid]/5