auto
auto
キーワードは C++11 および C++17 標準で再定義されました。 したがって、C++Builder では auto
の異なる定義をサポートしており、そのどちらになるかは、各 C++ コンパイラが準拠している標準で決まります。
- C++98 定義は、旧世代の C++ コンパイラ(BCC32 および BCCOSX)でサポートされています。
- C++11 定義は、C++11 互換 Clang 拡張 C++ コンパイラでサポートされています。
- C++14 および C++17 の定義は、C++11 互換Clang 拡張 C++ コンパイラでサポートされています。
このページは、auto
の定義で説明します。
C++98 の定義
カテゴリ
構文
[auto] <data-definition> ;
説明
auto 修飾子を使用すると、ローカル スコープでのみ有効なものとしてローカル変数を定義できます。
これはローカル変数のデフォルトであり、使用されることはまれです。
例:
void f() {
auto int x;
}
C++11 での定義
カテゴリ
構文
[auto] <variable_name> = <initializer_expression> ;
説明
auto
は、セマンティクスを初期化子式から推測する単純型指定子として使用されます。
例:
int f() {
return 1;
}
int _tmain(int argc, _TCHAR* argv[]) {
auto x = f();
return 0;
}
この例では、変数 x
の型はその初期化子式 f()
から推測されます。 そのため、x
は int 型となり、これは、 f()
が返す型です。
C++14 の定義
C++14 では、auto
はメソッドの戻り値型として使用して戻り値型を推測し、また、C++ と同様、変数や定数の型推論にも使用可能です。
例:
// C++14 introduces using the auto keyword for a return type
auto MyMethod() {
return “Hello world”;
}
int _tmain(int argc, _TCHAR* argv[]) {
// C++11 introduced type deduction for a variable / constant
auto x = MyMethod();
return 0;
}
C++17 での定義
In C++17, auto
はテンプレート パラメータで型や、構造型バインディングに対して推測するために使用できます。
構造型バインディングにより、簡単に個々の変数をタプルの要素に関連づけることができます。これにより、std::tuple を使用して効果的に複数の戻り値を返しているメソッドは、呼び出しているメソッド内で、それらの値を複数の変数に個別に割り当てることができます。
例:
std::tuple<int, float> returnMultiple()
{ int i = 1; float f = 3.14; return std::make_tuple(i, f); }
// In the calling method, with i and f predefined variables:
auto [i, f] = returnMultiple();
コード移行上の問題
Clang 拡張 C++ コンパイラは、古い auto
構文(つまり、記憶クラス指定子として使用されている auto
)に遭遇すると、次の警告を発します:
[<compiler> Warning] File1.cpp(12): 'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases.