簡體   English   中英

C ++類型限定符和相等性

[英]C++ type qualifiers and equality

int&int是同一類型嗎? 如果我使用is_same<int,int&>::value我會得到falsetypeid(int).name() == typeid(int&).name()相同嗎?

其次,對於intconst int同樣的問題嗎?

第三intint*嗎?

我可以理解intint*不是因為一個實際上存儲了另一個對象的地址並以不同的方式工作,但我會認為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&)會給出相同的結果。 類似地,對於類型系統intint const是不同的類型,但是typeid運算符忽略const限定。 根據C ++ 11標准的5.2.7 / 5段:

glvalue表達式或作為typeid操作數的type-id的頂級cv限定符始終被忽略。

最后,對於類型系統, intint*仍然是不同的類型,並且typeid運算符為它們返回不同的結果。

類型限定符( constvolatile )創建不同的類型。 intconst int是不同的類型。

引用,指針和數組也是如此。 例如:

intint&int[10]int*都是不同的類型。

T是由不同類型的std::remove_reference<T>::type如果T是一個參考。

typeid(int).name()<typeinfo>輸出是依賴於平台的,不必區分引用/非引用類型。 但是,正如您通過type_traits發現的那樣,C ++類型系統絕對可以區分TT&

std::type_info::name沒有std::type_info::name身份。 如果您堅持使用typeid測試身份,請嘗試以下操作:

assert(typeid(T) != typeid(U));

這是在type_info對象上使用定義的相等性比較運算符 但是要為失望做准備:由於第5.2.7 / 4節,上述聲明對於T = intU = int&將失敗(請參閱Andy的分析工具)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM