共用方式為


自動關鍵字 (型別推算)

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

auto declarator initializer;

備註

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

注意事項注意事項

在 Visual C++ 2010之前, auto 關鍵字是自動儲存類別的規範。該用法現在是錯誤。/Zc:auto 編譯器選項,是預設,告訴編譯器使用 auto 關鍵字的新的意義。

我們建議您針對大部分使用 auto 關鍵字情況,除非您確實要呈現,因為它提供下列優點:

  • 強固性: ,如果變更這個運算式的型別是由函式傳回型別變更時執行。

  • 效能: 您保證不會轉換。

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

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

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

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

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

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

初始化運算式可以是工作 (等號語法),直接初始化 (函式樣式語法),或 new 運算子 運算式。 或初始化運算式可以是在 以範圍為基礎的 for 陳述式 (C++) 陳述式中的 為範圍宣告 參數。 如需的詳細資訊,請參閱 初始設定式 和程式碼範例會讓文件。

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

可用性

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

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

您可以使用 decltype 型別規範一起使用,則為 auto,協助撰寫範本程式庫。 使用 auto 和 decltype 宣告傳回型別取決於其樣板引數的型別的樣板函式。 或者,使用 auto 和 decltype 宣告包裝呼叫其他函式的樣板函式,然後傳回什麼是該函式的傳回型別。 如需詳細資訊,請參閱decltype 型別規範

限制和錯誤訊息

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

錯誤代碼

描述

C3530

auto 關鍵字不能與其他型別規範。

C3531

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

C3532 錯誤

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

C3533C3539

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

C3534

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

C3535 錯誤

方法或樣板參數不可以是使用 auto 關鍵字進行宣告。

C3536

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

C3537

您不能轉換為是使用 auto 關鍵字進行宣告的型別。

C3538

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

C3540C3541

sizeoftypeid 運算子無法套用至宣告與 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 輸入 constint和變數 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;
    //...
}

請參閱

參考

自動關鍵字

儲存類別規範

C + + 關鍵字

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

將 sizeof 運算子

typeid

operator new (<new>)

宣告

Lambda 運算式的範例

初始設定式

decltype 型別規範