1. ホーム
  2. c++

[解決済み] C++のautoキーワード。なぜ魔法なのか?

2022-03-08 23:08:18

質問

C++を学ぶために使用したすべての教材から。 auto は、いつも何の役にも立たない奇妙な保管期間指定子でした。 しかし、つい最近、それ自体を型名として使っているコードに出会いました。 好奇心で試してみたところ、たまたま割り当てたものが何であれ、その型を仮定してしまうのです!

STLのイテレータをはじめ、テンプレートを使うものはすべて10倍は書きやすくなりますね。 Pythonのような「楽しい」言語を使っているような気分です。

このキーワードは私の人生のどこにあったのだろう? Visual Studio専用とか、ポータブルじゃないとか言って、私の夢を砕くのですか?

解決方法は?

auto は、C++がCから継承したキーワードで、ほぼ永遠に存在していましたが、2つの条件しかなかったため、事実上使われることはありませんでした:許可されていないか、デフォルトで仮定されていました。

の使用は auto は、C++11 で新たに導入されたものです。

同時に auto x = initializer の型を推論します。 x の型から initializer は、テンプレートの型推論が関数テンプレートに対して機能するのと同じ方法です。次のような関数テンプレートを考えてみましょう。

template<class T>
int whatever(T t) { 
    // point A
};

A地点で、ある型が T のパラメータに渡された値に基づいて whatever . を実行すると auto x = initializer; の型を決定するために、同じ型控除が使われます。 x の型から initializer を初期化するために使用されます。

つまり、コンパイラが実装する必要のある型推理の仕組みのほとんどは auto は、C++98/03 を実装しようとしたどんなコンパイラでも、すでに存在し、テンプレートに使用されていました。そのため auto これは、基本的にすべてのコンパイラチームにとってかなり簡単なことだったようで、かなり早く追加され、それに関連するバグもほとんどなかったようです。

この回答が最初に書かれたとき(2011年、C++ 11標準のインクが乾く前)には auto はすでにかなりポータブルでした。現在では、すべての主要なコンパイラの間で徹底的に移植性が高くなっています。これを避ける明らかな理由は、Cコンパイラと互換性のあるコードを書く必要がある場合、あるいは、これをサポートしていないことがわかっているニッチなコンパイラをターゲットにする特別な必要がある場合だけでしょう(たとえば、数十年間大きなアップグレードが行われていないボーランドやワコムなどのコンパイラを使ってMS-DOS用のコードを書いている人がまだ何人かいます)。主流のコンパイラの合理的な最新バージョンを使っているのであれば、それを避ける理由はまったくないのですが。

最近の規格改定では auto を使用することができます。C++14 からは auto をラムダへのパラメータの型として使用します。

    [](auto s) { return s + 1; }

これは、上記の例と本質的に同じことを行っている--ただし、この例では明示的に template の構文で、基本的にこれはパラメータの型を推論し、その型の上にテンプレートをインスタンス化するテンプレートです。

これが便利で便利で、C++20では、ラムダだけでなく、普通の関数にも同じ機能が追加されたんだ。

しかし、以前と同じように、これらすべては、C++98 以降の関数テンプレートと同じ基本的な型控除メカニズムを使用することに帰結します。 auto を使えば、より多くの場所で、より便利に使えるようになりますが、基本的な重労働は変わりません。