![](/img/trans.png)
[英]C++ - typeid(), used on derived class doesn't return correct type
[英]typeid doesn't return correct type
cout << typeid(int&).name();
我认为,这应该将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-id类型的type_info
对象。 如果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
类型而不是int&
类型的原因是typeid
的定义表明它忽略了引用。 引用规范§5.2.8/ 4:
当将typeid应用于type-id时,结果引用表示type-id类型的type_info对象。 如果type-id的类型是引用类型,则typeid表达式的结果引用表示所引用类型的type_info对象。
(我的重点)
这意味着typeid(int&)
和typeid(int)
彼此完全相同,因此输出是int
而不是int&
或与其相关的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.