C++(GCC 4.8.3)を使用して、私はtypeid(T1).name()
とtypeid(T2).name()
が同じであるが、 std::is_same<T1, T2>::value
がfalse
あるという奇妙な性質を持っている2種類(T1
とT2
)を持っています。同じタイプID名ではなく、はstd :: is_same
どのようにすることができますか?どのような理由があるのかをさらに調べるにはどうすればよいでしょうか?
C++(GCC 4.8.3)を使用して、私はtypeid(T1).name()
とtypeid(T2).name()
が同じであるが、 std::is_same<T1, T2>::value
がfalse
あるという奇妙な性質を持っている2種類(T1
とT2
)を持っています。同じタイプID名ではなく、はstd :: is_same
どのようにすることができますか?どのような理由があるのかをさらに調べるにはどうすればよいでしょうか?
typeid
すべてCV-修飾子を無視する:すべての場合において
、CV-修飾子はタイプIDによって無視される(すなわち、型ID(T)==型ID(CONST T)である)
これはtypeid
は(少数を示すために)すべての参照&
とconst
を無視することを意味します。
int i = 0;
const int&& j = 1;
if (typeid(i).hash_code() == typeid(j).hash_code()) //returns true
std::cout << "typeid(int) == typeid(const int&&)";
のみ2つの機能のために、それは2と同じtypeid
sが同じであることが保証されているため、2 typeid
Sを比較するための注意、あなたは、typeid(T).hash_code()
またはstd::type_index(typeid(T))
のいずれかを使用する必要があります。参考文献を比較してもその保証はありません。
オブジェクトTYPE_INFOこれらのSTD :: TYPE_INFO :: hash_codeは同一であるが、同じのstd ::インスタンスTYPE_INFOは、同じ型の型IDの表現のすべての評価によって参照されるという保証はありませんが、それらのstd :: type_indexと同じです。
std::remove_reference
と
std::remove_cv
を使用することができます。
std::remove_reference
は、Tのすべての参照を削除し、const
とvolatile
の修飾子をすべて削除します。 std::is_same
に渡す前にT
にこれらの関数を渡す必要があります。std::is_same
は、基底型(存在する場合)(とT2
)のみを比較します。
多型を無視すると、typeid()
は、式の静的型を表すオブジェクトを提供します。しかし、式の型に関しては無視される要素があります。 [式]から:式は、最初のタイプ「T
への参照」(8.3.2、8.5.3)を有する
場合、タイプは
T
前さらなる分析 に調整します。 [...] prvalueは最初T
が -unqualified非クラスは、非アレイタイプ、 のタイプは発現がT
前に任意に調整するCVあるタイプ「CVT
」を有する場合さらなる分析。
結果、トップレベルCV -qualificationまたは参照のみが異なる任意のタイプが同じタイプ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>>
:
template <class T>
using expr_type = std::remove_cv_t<std::remove_reference_t<T>>;
'トップレベルの修飾子を無視しtypeid'。 –
^^これはconstと& –
@SergeyAのようなものなので、typeidには実質的に使用されていないか、何か不足していますか? – user463035818