这是一个典型的实现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 总是比较字符串。
哪些平台不比较字符串?
在 libstdc++ 中它是由__GXX_MERGED_TYPEINFO_NAMES
在较新版本的 gcc 中(自 2009 年 7 月 23 日起)此宏默认设置为 0 https://github.com/gcc-mirror/gcc/commit/62164d4c3690257a01326783bed77c15831d52b9。它总是首先比较指针,如果失败,它们会进行完整的字符串比较。See here https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/libsupc%2B%2B/typeinfo#L48:
如果弱符号可用,我们过去默认情况下会进行内联指针比较,但即使使用弱符号,有时在加载对象时也不会合并名称RTLD_LOCAL
,所以现在我们总是使用strcmp
默认情况下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)