寫c++**時,經常遇到特別長的資料型別,由於這個原因,c++新增型別推導功能auto
。
用法:
auto a = 0;
型別推導,就是由編譯器在編譯期推導出=
右邊的資料型別,為=
左邊的變數決定資料型別。例如上面例子,0
預設是int
型別,那麼變數a
的資料型別就是int
。
有時候,不能使用型別推導但還是要用某個變數的型別作為新變數的型別,這個時候就可以用關鍵字deltype
。
型別提取經常與模板配合使用,模板是c++的利器,將在後續講解。
用法:
auto a = 0;
decltype(a) b = 10;
從變數a
中提取出資料型別,即int
,然後作為變數b
的資料型別,所以變數b
的資料型別也是int
。
當使用vs和vs code的時候,用滑鼠指著變數,將可以看到變數的資料型別。
舉個完整的**例子:
#include // std::cout std::endl std::boolalpha
#include // std::is_same
int main(void)
輸出結果:
value的型別是不是const unsigned long?true
由於0ul
是unsigned long
的型別,然後再配乙個const
關鍵字,所以變數value
的型別就是const unsigned long
。
const auto value = 0ul;
std::is_same
可以用來判斷兩個資料型別是不是一樣,用法如下:
std::is_same《資料型別1, 資料型別2>::value
當兩個資料型別相同時,上面的值就是true
;當兩個資料型別不相同時,上面的值就是false
。
使用decltype
提取出變數value
的資料型別:decltype(value)
,然後和const unsigned long
進行比較,最後輸出結果是true
,證明變數value
的資料型別就是const unsigned long
。
另外,std::is_same
使用前需要引入type_traits
標準庫。
關鍵字auto
很久以前,只要宣告變數都要在資料型別前面新增auto
。事實上,很久以前就可以不加,auto
相當乙個沒用的關鍵字。所以從c++11起,廢棄了這個沒用的功能。
從c++11起,關鍵字auto
被賦予型別推導的功能。
關鍵字decltype
從c++11開始加入。
c 11 型別推導
auto與decltype都是在編譯時期進行自動型別的推導 auto name value 1.int x 0 2.auto p1 x p1 為 int auto 推導為 int 3.auto p2 x p2 為 int auto 推導為 int 4.auto r1 x r1 為 int auto ...
C 11 型別推導auto
在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...
C 中Traits技術 4 型別推導
繼續理解traits技術。當我們處理原生指標時,會遇到需要知道其所指物件型別這樣的問題。如何實現呢?template void testtypeforward t t c 中我們不允許使用typedef t 這樣的語句。其中的一種解決方案是 將這個功能實現傳遞給另乙個函式去完成。template v...