typeid不返回正确的类型

The*_* do 5 c++ typeid

cout << typeid(int&).name();  
Run Code Online (Sandbox Code Playgroud)

在我看来,这应该int&作为一种类型而不是一种类型返回int,而是在GCC 4.5.1和VS2010 SP1 beta上返回int.为什么是这样?

CB *_*ley 8

这就是typeid应该起作用的方式.当您应用于引用类型typeidtype-id时,该type_info对象引用引用的类型.

ISO/IEC 14882:2003,5.2.8/4 [expr.typeid]:

typeid应用于type-id时,结果引用type_info表示type-id类型的对象.如果type-id类型是引用类型,则typeid表达式的结果type_info引用表示引用类型的对象.如果type-id类型是类类型或类类型的引用,则应完全定义类.类型不应在type-id中定义.


ild*_*arn 6

你的第一个错误是期待任何有用的东西std::type_info::name().从标准:

  • §18.5.1/ 1:"类型的名称,编码规则和整理顺序都是未指定的,程序之间可能有所不同. "
  • §18.5.1/ 7:" const char* name() const;返回:实现定义的 NTBS. "

如果你想要进行有意义的(通过不一定一致)键入名称的便携式解决方案,我建议使用Boost.TypeIndexboost::typeindex::type_id_with_cvr<>().pretty_name()(参考).


tem*_*def 5

C++ 规范不保证type_info::name实际交回出现在 C++ 源代码中的类型名称;事实上,规范第 18.5.1/7 节仅保证函数返回“实现定义的 NTBS”。

因此,没有理由假设使用typeid来获取类型的名称实际上会像您期望的那样返回类型的名称。

您看到的类型int和 not 的原因int&是,的定义typeid说它忽略了引用。引用规范,§5.2.8/4:

当 typeid 应用于 type-id 时,结果引用一个表示 type-id 类型的 type_info 对象。如果 type-id 的类型是引用类型,则 typeid 表达式的结果引用表示引用类型的 type_info 对象。

(我的重点)

这意味着typeid(int&)typeid(int)彼此完全相同,因此输出是intand notint&或与之相关的东西。