cout << typeid(int&).name();
Run Code Online (Sandbox Code Playgroud)
在我看来,这应该int&作为一种类型而不是一种类型返回int,而是在GCC 4.5.1和VS2010 SP1 beta上返回int.为什么是这样?
这就是typeid应该起作用的方式.当您应用于引用类型typeid的type-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中定义.
你的第一个错误是期待任何有用的东西std::type_info::name().从标准:
const char* name() const;返回:实现定义的 NTBS. "如果你想要进行有意义的(通过不一定一致)键入名称的便携式解决方案,我建议使用Boost.TypeIndex的boost::typeindex::type_id_with_cvr<>().pretty_name()(参考).
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&或与之相关的东西。