Вот типичная реализация 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 всегда сравнивает строки.
Какие платформы не сравнивают строки?
In libstdc++ it's controlled with
__GXX_MERGED_TYPEINFO_NAMES
В более новых версиях gcc (с 23 июля 2009 г.) для этого макроса по умолчанию установлено значение 0.. Он всегда сначала сравнивает указатели, и если это не удается, выполняется полное сравнение строк. Глянь сюда:
We used to do inline pointer comparison by default if weak symbols are available, but even with weak symbols sometimes names are not merged when objects are loaded with
RTLD_LOCAL
, so now we always usestrcmp
by default.
@ o11c 3 цели перекрывают его: __GXX_MERGED_TYPEINFO_NAMES=0
.
Эээ, верно, но они перезаписывают его до значения, которое у него уже есть.
Примечательно, что это возможный для цели, чтобы переопределить это, но на самом деле ни одна цель не делает.