Share via


auto キーワード (の型推論)

初期化子式から宣言された変数の型を推測します。

auto declarator initializer;

解説

auto のキーワード、コンパイラが型を推論するために宣言された変数の初期化子式を使用するようになります。

[!メモ]

Visual C++ 2010の前に、auto のキーワードは auto ストレージ クラスの指定子です。これで、その使用はエラーになります。既定値である /Zc:auto のコンパイラ オプションは、コンパイラを auto のキーワードの新しい意味を使用するように指示します。

これは次の利点を提供するため、実際に変換するには、ほとんどの状態に auto のキーワードを使用することをお勧めします:

  • 関数の戻り値の型が変更は、常機能を変更、この式の型が含まれている場合**:長所**。

  • 変換がないことパフォーマンス: 保証されます。

  • 操作: 型名のスペルと入力ミスがあるの問題を気にする必要はありません。

  • 効率: は、のコーディングよりもあります。

、autoを使用しない場合があります:ケースの変換

  • 特定の型と使用する場合は、何も説明します。

  • まれに auto x = { 1 }; };を書き込み、実際に intを取得するように選択しないリストが、(valarray+valarray) 例と初期化子式の型のテンプレート ヘルパー。

auto のキーワードを使用するには、変数を宣言するために型の代わりに、を使用して初期化子式を指定します。また、const、volatile、ポインター (*)、参照 (&)、および rvalue 参照 ((&&) のような指定子と宣言子を使用して auto のキーワードを変更できます)。コンパイラは初期化式を評価し、その情報を使用して変数の型を推測します。

初期化子式は、代入 (等号の構文)、直接初期化 (関数の構文)、または 新しい演算子 の式のいずれでもかまいません。または初期化子式が 範囲ベースの for ステートメント (C++) ステートメントの 範囲では申告 のパラメーターです。詳細については、このドキュメントの 初期化子 とコード例を参照してください。

auto のキーワードは、型のプレースホルダーですが、それ自体は型ではありません。したがって、auto キーワードは、sizeoftypeid などのキャストまたは演算子では使用できません。

実用性

auto キーワードは、複雑な型を持つ変数を宣言する簡単な方法です。たとえば、初期化子式が関数にテンプレート、ポインター、またはメンバーへのポインターを含む変数を宣言するには auto を使用できます。

また、ラムダ式に変数の宣言と初期化のに auto を使用できます。ラムダ式の型がコンパイラにのみ取得できるので、独自変数の型を宣言できません。詳細については、「ラムダ式の例」を参照してください。

テンプレート ライブラリを作成するには autoを、decltype の型指定子とともに使用できます。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 型として宣言されます。2 番目のステートメントでは、初期化式 (0) が整数であるため、変数 k は int と推測されます。

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

次の宣言は同じ意味を持ちますが、2 番目の宣言の方が最初の宣言より単純です。auto キーワードを使用する最も説得力のある理由の 1 つは簡潔さです。

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

次のコードは iter 変数と elem の型をと for と範囲の for のループの開始宣言します。

// 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.

このコードは、200 の値を持つ整数として可変 x を宣言するには、条件演算子 (?:) を使用します:

   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;
    //...
}

参照

関連項目

auto キーワード

ストレージ クラスの指定子

C++ のキーワード

/Zc:auto (変数の型の推測)

sizeof 演算子

typeid

operator new (<new>)

宣言

ラムダ式の例

初期化子

decltype 型指定子