自動關鍵字 (型別推算)
從其初始化運算式推算宣告的變數型別。
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 關鍵字不能用在轉型或運算子 (例如 sizeof 和 typeid。
可用性
auto 關鍵字是一個簡單的方法宣告具有複雜型別的變數。 例如,您可以使用 auto 宣告初始化運算式包含範本、指標、函式指標給成員的變數。
您也可以使用 auto 宣告和初始化變數到 Lambda 運算式。 因為 Lambda 運算式的型別只知道傳遞給編譯器,您無法宣告變數的型別。 如需詳細資訊,請參閱Lambda 運算式的範例。
您可以使用 decltype 型別規範一起使用,則為 auto,協助撰寫範本程式庫。 使用 auto 和 decltype 宣告傳回型別取決於其樣板引數的型別的樣板函式。 或者,使用 auto 和 decltype 宣告包裝呼叫其他函式的樣板函式,然後傳回什麼是該函式的傳回型別。 如需詳細資訊,請參閱decltype 型別規範。
限制和錯誤訊息
下表列出對用於限制 auto 關鍵字與對應的診斷的錯誤訊息編譯器發出。
錯誤代碼 |
描述 |
---|---|
auto 關鍵字不能與其他型別規範。 |
|
為使用 auto 關鍵字宣告的符號必須有初始設定式。 |
|
不正確地使用 auto 關鍵字宣告型別。 例如,您宣告方法傳回型別或陣列。 |
|
參數或樣板引數不能是使用 auto 關鍵字進行宣告。 |
|
宣告與 new 運算式的 auto 關鍵字的符號必須有初始設定式。 如需詳細資訊,請參閱operator new (<new>)。 |
|
方法或樣板參數不可以是使用 auto 關鍵字進行宣告。 |
|
符號,在初始化之前,無法使用。 實際上,這表示變數無法用來初始化其本身。 |
|
您不能轉換為是使用 auto 關鍵字進行宣告的型別。 |
|
在宣告中使用 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;
//...
}