1. 程式人生 > >【C++】auto關鍵字

【C++】auto關鍵字

在早期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作為模板引數