【C++】auto關鍵字
阿新 • • 發佈:2019-01-13
在早期C/C++中auto的含義是:使用auto修飾的變數,是具有自動儲存器的區域性變數。
C++11中,auto有了全新的含義即:auto不再是一個儲存型別指示符,而是作為一個新的型別
指示符來指示編譯器,auto宣告的變數必須由編譯器在編譯時期推導而得。
通俗地講,auto關鍵字是可以自動推導變數型別的。
需要注意的是,auto不是一個型別的“宣告”,而是一個“佔位符”,編譯器在編譯期會將auto替換為變數實際的型別。使用auto定義變數時必須對其進行初始化,在編譯階段編譯器需要根據初始化表示式來推導auto的實際型別。它自動推導變數型別是根據“=”右側的變數型別決定的。下面是一段例子:
int TestAuto() { return 10; } int main() { int a = 10; auto b = a; //推匯出b為int auto c = 'a'; //推匯出c為char auto d = TestAuto(); //和TestAuto返回的型別一樣,即int cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; cout << typeid(d).name() << endl; //auto e; 無法通過編譯,使用auto定義變數時必須對其進行初始化 return 0; }
使用規則
可以使用的場景:
1. auto與指標和引用結合起來使用
用auto宣告指標型別時,用auto和auto*沒有任何區別,但用auto宣告引用型別時則必須加&
int main() { int x = 10; auto a = &x; auto* b = &x; auto& c = x; cout << typeid(a).name() << endl; cout << typeid(b).name() << endl; cout << typeid(c).name() << endl; *a = 20; *b = 30; c = 40; return 0; }
2. 在同一行定義多個變數
當在同一行宣告多個變數時,這些變數必須是相同的型別,否則編譯器將會報錯,因為編譯器實際只對
第一個型別進行推導,然後用推匯出來的型別定義其他變數。
void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 該行程式碼會編譯失敗,因為c和d的初始化表示式型別不同
}
不可以使用的場景:
1. auto不能作為函式的引數
引數要被編譯成指令,但是開闢空間時候需要知道空間大小,auto做引數不知道多大,那麼棧幀也不知道開多大。
// 此處程式碼編譯失敗,auto不能作為形參型別,因為編譯器無法對a的實際型別進行推導
void TestAuto(auto a)
{}
2. auto不能直接用來宣告陣列
因為陣列也涉及大小,在下面的例子中,a的型別嚴格來說是 int [3],所以b的大小也不確定。
void TestAuto()
{
int a[] = {1,2,3};
auto b[3] = a;
}
3. 為了避免與C++98中的auto發生混淆,C++11只保留了auto作為型別指示符的用法
4. auto在實際中最常見的優勢用法是C++11提供的新式for迴圈,還有lambda表示式等
進行配合使用。
5. auto不能定義類的非靜態成員變數
6. 例項化模板時不能使用auto作為模板引數