[英]C++ type qualifiers and equality
int&
和int
是同一類型嗎? 如果我使用is_same<int,int&>::value
我會得到false
但typeid(int).name() == typeid(int&).name()
相同嗎?
其次,對於int
和const int
同樣的問題嗎?
第三int
和int*
嗎?
我可以理解int
和int*
不是因為一個實際上存儲了另一個對象的地址並以不同的方式工作,但我會認為int&
和int
只是另一個的別名。
熱衷於對此發表一些好的評論。
根據C ++ 11標准的5.2.7 / 4段:
當將typeid應用於type-id時,結果將引用代表該type-id類型的std :: type_info對象。 如果type-id的類型是對可能cv限定的類型的引用,則typeid表達式的結果將引用一個std :: type_info對象,該對象表示cv不限定的引用類型 。 如果type-id的類型是類類型或對類類型的引用,則該類應完整定義。
因此,盡管兩種類型肯定不同,但typeid(int)
和typeid(int&)
會給出相同的結果。 類似地,對於類型系統int
和int const
是不同的類型,但是typeid
運算符忽略const
限定。 根據C ++ 11標准的5.2.7 / 5段:
glvalue表達式或作為typeid操作數的type-id的頂級cv限定符始終被忽略。
最后,對於類型系統, int
和int*
仍然是不同的類型,並且typeid
運算符為它們返回不同的結果。
類型限定符( const
和volatile
)創建不同的類型。 int
與const int
是不同的類型。
引用,指針和數組也是如此。 例如:
int
, int&
, int[10]
和int*
都是不同的類型。
T
是由不同類型的std::remove_reference<T>::type
如果T
是一個參考。
typeid(int).name()
的<typeinfo>
輸出是依賴於平台的,不必區分引用/非引用類型。 但是,正如您通過type_traits
發現的那樣,C ++類型系統絕對可以區分T
和T&
。
std::type_info::name
沒有std::type_info::name
身份。 如果您堅持使用typeid
測試身份,請嘗試以下操作:
assert(typeid(T) != typeid(U));
這是在type_info
對象上使用定義的相等性比較運算符 。 但是要為失望做准備:由於第5.2.7 / 4節,上述聲明對於T = int
和U = int&
將失敗(請參閱Andy的分析工具)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.