繁体   English   中英

typeid没有返回正确的类型

[英]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()任何有用的东西。 从标准:

  • §18.5.1/ 1:“类型的名称,编码规则和排序顺序均未指定 ,并且在程序之间可能有所不同。
  • §18.5.1/ 7:“ const char* name() const;返回: 实现定义的 NTBS。

如果您想为有意义的(不一定是一致的)类型名称提供一个可移植的解决方案,我建议使用Boost.TypeIndexboost::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM