cout << typeid(int&).name();
在我看来,这应该返回int&
作为类型,而不是int
,但是在GCC 4.5.1和VS2010 SP1 beta上它会返回int
。这是为什么?
答案 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()
有用的东西。从标准:
const char* name() const;
返回:实现定义的 NTBS。”如果您想要一个有意义(通过不一定一致)类型名称的便携式解决方案,我建议您使用Boost.TypeIndex的boost::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&
或与之相关的内容。