使用 C++ (gcc 4.8.3) 我有 2 种类型 (T1
and T2
)具有奇怪的性质typeid(T1).name()
and typeid(T2).name()
是相同的但是std::is_same<T1, T2>::value
is false
.
怎么可能?我怎样才能进一步调查以找出原因可能是什么?
忽略多态性,typeid()
为您提供一个表示表达式静态类型的对象。但在涉及表达式类型时,某些元素会被忽略。来自[expr]:
如果表达式最初的类型为“引用T
”(8.3.2、8.5.3),类型调整为T
之前
任何进一步的分析。 [...] 如果纯右值最初具有类型“cv T
“, 在哪里T
is a cv-unqualified 非类、非数组类型、类型
表达式调整为T
在进行任何进一步分析之前。
因此,任何仅在顶层不同的类型cv-资格或参考将产生相同的类型ID。例如,类型int
, const int
, int&
volatile const int&&
等都给你相同的typeid()
.
基本上,您最初的思考过程是:
typeid(T) == typeid(U) <==> std::is_same<T, U>
但正确的等价是:
typeid(T) == typeid(U) <==> std::is_same<expr_type<T>, expr_type<U>>
where:
template <class T>
using expr_type = std::remove_cv_t<std::remove_reference_t<T>>;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)