【问题标题】:typeid doesn't return correct typetypeid 没有返回正确的类型
【发布时间】:2025-12-25 13:05:11
【问题描述】:
cout << typeid(int&).name();  

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

【问题讨论】:

  • 更好的测试:cout &lt;&lt; (typeid(int&amp;) == typeid(int));

标签: c++ typeid


【解决方案1】:

这就是 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 中定义。

【讨论】:

    【解决方案2】:

    您的第一个错误是期望 std::type_info::name() 提供任何有用的信息。来自标准:

    • §18.5.1/1:“类型的名称、编码规则和整理顺序都是未指定,并且可能因程序而异。
    • §18.5.1/7:“const char* name() const; 返回:实现定义的 NTBS。

    如果您想要一个有意义的(通过不一定一致的)类型名称的可移植解决方案,我建议使用Boost.TypeIndexboost::typeindex::type_id_with_cvr&lt;&gt;().pretty_name() (reference)。

    【讨论】:

      【解决方案3】:

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

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

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

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

      (我的重点)

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

      【讨论】: