typeid不返回正确的类型

时间:2011-03-01 08:09:04

标签: c++ typeid

cout << typeid(int&).name();  

在我看来,这应该返回int&作为类型,而不是int,但是在GCC 4.5.1和VS2010 SP1 beta上它会返回int。这是为什么?

3 个答案:

答案 0 :(得分:8)

这就是typeid应该起作用的方式。将typeid应用于引用类型的 type-id 时,type_info对象引用引用的类型。

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

  

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

答案 1 :(得分: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()reference)。

答案 2 :(得分:4)

C ++规范并不保证type_info::name实际上会回放C ++源代码中出现的类型名称;实际上,规范§18.5.1/ 7只保证该函数返回“实现定义的NTBS”。

因此,没有理由假设使用typeid来获取类型的名称实际上会按照您的预期回复该类型的名称。

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

  

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

(我的重点)

这意味着typeid(int&)typeid(int)彼此完全相同,因此输出为int而不是int&或与之相关的内容。