C++
是靜態(tài)語言:所有變量的類型,都會(huì)在編譯時(shí)被準(zhǔn)確指定。所以,作為程序員你需要為每個(gè)變量指定對(duì)應(yīng)的類型。
有些時(shí)候就需要使用一些繁瑣類型定義,比如:
std::map<std::string,std::unique_ptr<some_data>> m;
std::map<std::string,std::unique_ptr<some_data>>::iterator
iter=m.find("my key");
常規(guī)的解決辦法是使用typedef來縮短類型名的長度。這種方式在C++
11中仍然可行,不過這里要介紹一種新的解決辦法:如果一個(gè)變量需要通過一個(gè)已初始化的變量類型來為其做聲明,那么就可以直接使用auto
關(guān)鍵字。這樣,編譯器就會(huì)通過已初始化的變量,去自動(dòng)推斷變量的類型。
auto iter=m.find("my key");
當(dāng)然,auto
還有很多種用法:可以使用它來聲明const、指針或引用變量。這里使用auto
對(duì)相關(guān)類型進(jìn)行了聲明:
auto i=42; // int
auto& j=i; // int&
auto const k=i; // int const
auto* const p=&i; // int * const
變量類型的推導(dǎo)規(guī)則是建立一些語言規(guī)則基礎(chǔ)上:函數(shù)模板參數(shù)。其聲明形式如下:
some-type-expression-involving-auto var=some-expression;
var變量的類型與聲明函數(shù)模板的參數(shù)的類型相同。要想替換auto
,需要使用完整的類型參數(shù):
template<typename T>
void f(type-expression var);
f(some-expression);
在使用auto
的時(shí)候,數(shù)組類型將衰變?yōu)橹羔槪脤?huì)被刪除(除非將類型進(jìn)行顯式為引用),比如:
int some_array[45];
auto p=some_array; // int*
int& r=*p;
auto x=r; // int
auto& y=r; // int&
這樣能大大簡化變量的聲明過程,特別是在類型標(biāo)識(shí)符特別長,或不清楚具體類型的時(shí)候(例如,調(diào)用函數(shù)模板,等到的目標(biāo)值類型就是不確定的)。