共用方式為


auto 關鍵字 (類型推斷)

從其初始化運算式推算宣告的變數型別。

auto declarator initializer;

備註

auto 關鍵字會指示編譯器使用宣告變數的初始化運算式推算其型別。

我們建議您針對大部分情況使用 auto 關鍵字,除非您真正想要轉換,因為它提供下列優點:

  • 強固性: ,如果運算式的型別已變,包括函式的回傳型別改變,它仍然能夠運作。

  • 效能: 保證這之間不會執行型別轉換。

  • 可用性: 您不必擔心型別名稱拼字問題和錯誤的字。

  • 效率: 您的程式碼會更有效率。

您可能不想使用 auto轉換的情況:

  • 當您想要特定型別,之後也不會做什麼。

  • 運算式範本協助程式型別 (例如、 (valarray+valarray) 和初始設定式清單),雖然您很少會選取寫入 auto x = { 1 }; 而其實想要得到 int。

若要使用 auto關鍵字,請直接使用而不是使用型別去宣告變數,並指定初始化運算式。 此外,您可以使用規範和宣告子修改 auto關鍵字,例如 const、 volatile、指標 (*),參考 (&) 和 rvalue 參考 (&&)。 編譯器評估初始化運算式再使用該資訊推算變數的型別。

初始化運算式可以是指派 (等號語法),直接初始化 (函式樣式語法), new 運算子 運算式,或初始化運算式可以是在 以範圍為基礎的 for 陳述式 (C++) 陳述式中的 for-range-declaration 參數。 如需詳細資訊,請參閱 初始設定式 和本主題後面的程式碼範例。

auto 關鍵字是型別的替代符號,但本身不是型別。 因此, auto 關鍵字不能用在轉型或運算子 (例如 sizeoftypeid (C++ 元件擴充功能)

可用性

auto 關鍵字是一個宣告具有複雜型別的變數的簡單方法。 例如,您可以使用 auto 宣告初始化運算式包含範本、指標至函式、或指標至成員的變數。

您也可以使用 auto 宣告和初始化變數到 Lambda 運算式。 因為 Lambda 運算式的型別只能被編譯器識別,所以您無法宣告 Lambda 變數的型別。 如需詳細資訊,請參閱Lambda 運算式的範例

尾端傳回類型

您可以將 decltype 型別規範與 auto 一同使用 ,協助撰寫範本程式庫。 使用 auto 以及 decltype 來宣告其傳回型別視樣板引數而定的樣板函式, 或者,使用 auto 和 decltype 宣告包裝呼叫其他函式的樣板函式,然後傳回什麼是該函式的傳回型別。 如需詳細資訊,請參閱decltype 類型規範

參考和 cv 限定詞

請注意使用 auto 將丟失參考、const 限定詞和 volatile 限定詞。 參考下列範例:

// cl.exe /analyze /EHsc /W4
#include <iostream>
 
using namespace std;
 
int main( )
{
    int count = 10;
    int& countRef = count;
    auto myAuto = countRef;
 
    countRef = 11;
    cout << count << " ";
 
    myAuto = 12;
    cout << count << endl;
}

您可能會認為 myAuto 是 int 的參考,不過,它不是。 它是 int,因此,輸出是 11 11,沒有 11 12 ,如果參考沒有被 auto 丟失情況就會相反。

限制和錯誤訊息

下表列出對 auto 關鍵字的限制與編譯器對應發出的錯誤訊息診斷。

錯誤編號

描述

C3530

auto 關鍵字無法與任何其他型別規範合併使用

C3531

使用 auto 關鍵字宣告的符號必須有初始設定式。

C3532

不正確地使用 auto 關鍵字宣告型別。 例如,您宣告方法傳回型別或陣列。

C3533C3539

參數或樣板引數不能使用 auto 關鍵字進行宣告。

C3534

宣告有 auto 型別的 new 運算式的符號必須有初始設定式。 如需詳細資訊,請參閱operator new (<new>)

C3535

方法或樣板引數不能使用 auto 關鍵字進行宣告。

C3536

符號無法在初始化之前使用 實際上,這表示變數無法用來初始化其本身。

C3537

您不能對已經宣告為 auto 關鍵字的物件進行型別轉換。

C3538

宣告子的符號清單中所有宣告為 auto 關鍵字的符號必須解析為相同型別。 如需詳細資訊,請參閱宣告

C3540C3541

sizeoftypeid (C++ 元件擴充功能) 運算子無法套用至宣告為 auto 關鍵字的符號。

範例

這些程式碼片段說明使用 auto 關鍵字的一些方法。

下列兩個宣告的用法是相同的。 在第一個陳述式,變數 j 是宣告為 int型別。 在第二個陳述式,變數 k 推論為 int 型別,因為初始化運算式 (0) 是整數。

   int j = 0;  // Variable j is explicitly type int.
   auto k = 0; // Variable k is implicitly type int because 0 is an integer.

下列宣告相同,不過,第二個宣告較第一個簡單。 其中一個最吸引人使用 auto 關鍵字的原因是簡單性。

   map<int,list<string>>::iterator i = m.begin(); 
   auto i = m.begin(); 

下列程式碼片段當 for 和範圍 for 迴圈開始時,會宣告變數型別給 iter 和 elem 。

// cl /EHsc /nologo /W4
#include <deque>
using namespace std;

int main()
{
    deque<double> dqDoubleData(10, 0.1);

    for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
    { /* ... */ }

    // prefer range-for loops with the following information in mind
    // (this applies to any range-for with auto, not just deque)

    for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
    { /* ... */ }

    for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
    { /* ... */ }

    for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
    { /* ... */ }
}

下列程式碼片段使用 new 運算子和指標宣告以宣告指標。

   double x = 12.34;
   auto *y = new auto(x), **z = new auto(&x);

下一個程式碼片段在每個宣告陳述式宣告多個符號。 請注意在每個陳述式中,所有符號解析為相同型別。

   auto x = 1, *y = &x, **z = &y; // Resolves to int.
   auto a(2.01), *b (&a);         // Resolves to double.
   auto c = 'a', *d(&c);          // Resolves to char.
   auto m = 1, &n = m;            // Resolves to int.

這個程式碼片段使用條件運算子 (?:) 宣告變數 x 為具有值為 200 的整數:

   int v1 = 100, v2 = 200;
   auto x = v1 > v2 ? v1 : v2;

下列程式碼片段初始化變數 x 至型別 int,變數 y 至型別 const int的參考,以及變數 fp 到指標至傳回型別為 int的函式。

int f(int x) { return x; }
int main()
{
    auto x = f(0);
    const auto & y = f(1);
    int (*p)(int x);
    p = f;
    auto fp = p;
    //...
}

請參閱

參考

auto 關鍵字

儲存類別規範

C++ 關鍵字

/Zc:auto (推算變數類型)

sizeof 運算子

typeid (C++ 元件擴充功能)

operator new (<new>)

宣告

Lambda 運算式的範例

初始設定式

decltype 類型規範