auto
は、C++ が C から「継承」したキーワードで、ほぼ永久に存在していましたが、可能な条件が 2 つしかなかったため、実質的に使用されることはありませんでした。許可されていないか、デフォルトで想定されていました。
推定型を意味するの使用はauto
、C++11 で新しく導入されました。
同時に、テンプレートの型推定が関数テンプレートに対して機能するのと同じ方法で、型の型から の型auto x = initializer
を推定します。次のような関数テンプレートを考えてみましょう:x
initializer
template<class T>
int whatever(T t) {
// point A
};
T
ポイント A では、に渡されたパラメーターの値に基づいて型が に割り当てられていますwhatever
。を実行するauto x = initializer;
と、同じ型推定を使用して、初期化に使用されx
た の型から の型が決定initializer
されます。
これは、コンパイラが実装する必要がある型推論メカニズムのほとんどauto
が既に存在し、C++98/03 の実装を試みるコンパイラのテンプレートに使用されていることを意味します。そのため、 のサポートを追加することauto
は、本質的にすべてのコンパイラ チームにとって明らかにかなり簡単でした。これは非常に迅速に追加され、それに関連するバグもほとんどないようです。
この回答が最初に書かれたとき(2011年、C++ 11標準でインクが乾く前)auto
は、すでにかなり移植可能でした。今日では、すべての主流のコンパイラ間で完全に移植可能です。それを回避する唯一の明白な理由は、C コンパイラと互換性のあるコードを書く必要がある場合、またはそれをサポートしていないことがわかっているニッチなコンパイラをターゲットにする必要がある場合です (たとえば、まだコードを書いている人は少数です)。 MS-DOS の場合、Borland、Watcom などのコンパイラを使用しており、これらのコンパイラは何十年も大幅なアップグレードを行っていません)。主流のコンパイラのかなり最新のバージョンを使用している場合でも、それを避ける理由はまったくありません。
標準の最近のリビジョンでは、auto
使用できる新しい場所がいくつか追加されています。C++14 以降でauto
は、パラメーターの型としてラムダを使用できます。
[](auto s) { return s + 1; }
これは基本的に上記の例と同じことを行います。明示的に構文を使用していませんがtemplate
、これは基本的に、パラメーターの型を推測し、その型でテンプレートをインスタンス化するテンプレートです。
これは便利で便利だったので、C++20 ではラムダ関数だけでなく、通常の関数にも同じ機能が追加されました。
しかし、これまでと同様に、C++98 以降の関数テンプレートと同じ基本的な型推論メカニズムを使用することになります。auto
より多くの場所でより便利に使用できるようになりますが、根底にある重労働は同じままです。