【发布时间】:2025-12-25 13:05:11
【问题描述】:
cout << typeid(int&).name();
在我看来,这应该返回 int& 作为类型,而不是 int,但在 GCC 4.5.1 和 VS2010 SP1 beta 上它返回 int。这是为什么呢?
【问题讨论】:
-
更好的测试:
cout << (typeid(int&) == typeid(int));
cout << typeid(int&).name();
在我看来,这应该返回 int& 作为类型,而不是 int,但在 GCC 4.5.1 和 VS2010 SP1 beta 上它返回 int。这是为什么呢?
【问题讨论】:
cout << (typeid(int&) == typeid(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() (reference)。
【讨论】:
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& 或与之相关的东西。
【讨论】: