詳細(xì)分析Visual Studio auto關(guān)鍵字
Visual Studio經(jīng)過長時(shí)間的發(fā)展,很多用戶都很了解Visual Studio auto關(guān)鍵字了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。在C++0x中,auto關(guān)鍵字的意義發(fā)生了改變。從Visual C++ 2010開始,Visual Studio auto關(guān)鍵字將用于指引編譯器根據(jù)變量的初始值來決定變量的數(shù)據(jù)類型。換句話說,我們可以把a(bǔ)uto當(dāng)成一種新的數(shù)據(jù)類型,它可以“從初始化器(initialize)中推導(dǎo)出所代表的變量的真正類型”。這種對auto關(guān)鍵字的使用方式可以大大消除當(dāng)前替代方式所導(dǎo)致的冗長和易出錯的代碼。我們看一個(gè)實(shí)際的例子:
- #include <iostream>
- #include <map>
- #include <ostream>
- #include <regex>
- #include <string>
- using namespace std;
- using namespace std::tr1;
- int main() {
- map<string, string> m;
- const regex r("(\\w+) (\\w+)");
- for (string s; getline(cin, s); ) {
- smatch results;
- if (regex_match(s, results, r)) {
- m[results[1]] = results[2];
- }
- }
- for (auto i = m.begin(); i != m.end(); ++i) {
- cout << i->second << " are " << i->first << endl;
- }
- return 0;
- }
#t#在這段代碼中,我們使用Visual Studio auto關(guān)鍵字來代替了真正的數(shù)據(jù)類型map<string, string>::iterator,這使得整個(gè)代碼自然而簡潔。
另外,跟其他數(shù)據(jù)類型一樣,我們也可以對Visual Studio auto關(guān)鍵字進(jìn)行修飾,例如添加const,指針(*),左值引用(&),右值引用(&&)等等,編譯器會根據(jù)auto類型所代表的真正的數(shù)據(jù)來決定這些修飾的具體含義。
為了兼容一些舊有的C++代碼,我們可以使用/Zc:auto這個(gè)編譯器選項(xiàng),來告訴編譯器是采用Visual Studio auto關(guān)鍵字的原有定義還是在新標(biāo)準(zhǔn)C++0x中的定義。