哪些平台的type_info类operator==未采用字符串比较实现?
哪些平台的type_info类operator==运算符未使用字符串比较?
咱们直接从主流C++标准库的type_info::operator==实现细节来拆解这个问题:
libstdc++(GNU 标准库)
它的行为由宏__GXX_MERGED_TYPEINFO_NAMES控制。当这个宏被定义时,相同类型的type_info对象会共享同一个 mangled name 字符串指针,此时operator==直接比较指针地址(完全不涉及字符串比较);如果未定义这个宏,会先尝试指针比较,指针不相等时再通过strcmp做字符串内容比对。libc++(LLVM 标准库)
由_LIBCPP_NONUNIQUE_RTTI_BIT这个机制控制。当非唯一RTTI特性未启用时,type_info::operator==仅比较 mangled name 的指针;只有启用了该特性,才会在指针比较失败后执行字符串比较。MSVC(微软 C++ 标准库)
不管什么场景,它的type_info::operator==始终会执行字符串比较,不会依赖指针相等性来判断类型是否一致。
下面是这类实现的典型代码示例:
#if _PLATFORM_SUPPORTS_UNIQUE_TYPEINFO bool operator==(const type_info& __rhs) const { return __mangled_name == __rhs.__mangled_name; } #else bool operator==(const type_info& __rhs) const { return __mangled_name == __rhs.__mangled_name || strcmp(__mangled_name, __rhs.__mangled_name) == 0; } #endif
内容的提问来源于stack exchange,提问作者Abyx
相关产品推荐
相关产品推荐

