【C++】autoキーワード

2104 ワード

初期のC/C++におけるautoの意味は,auto修飾を用いた変数であり,自動メモリを有する局所変数である.
C++11では、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をタイプインジケータとしての使用のみを保持する.autoの実際に最も一般的な利点は,C++11が提供する新しいforループ,lambda式などを組み合わせて使用することである.5.autoはクラスの非静的メンバー変数6を定義できない.テンプレートをインスタンス化するときはautoをテンプレートパラメータとして使用できません