以下是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
在libstdc ++中,它由__GXX_MERGED_TYPEINFO_NAMES
控制,
在libc ++中它是_LIBCPP_NONUNIQUE_RTTI_BIT
,
MSVC总是比较字符串。
哪些平台不比较字符串?
答案 0 :(得分:2)
在libstdc ++中,它由
控制__GXX_MERGED_TYPEINFO_NAMES
In newer versions of gcc (since 23 Jul 2009) this macro is set to 0 by default。它总是首先比较指针,如果比较失败,它们将进行完整的字符串比较。 See here:
如果弱符号可用,我们默认情况下会进行内联指针比较,但是即使使用弱符号,有时在用
RTLD_LOCAL
加载对象时名称也不会合并,所以现在我们总是使用strcmp
默认。