[解決済み] C++のautoキーワード。なぜ魔法なのか?
質問
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
を使えば、より多くの場所で、より便利に使えるようになりますが、基本的な重労働は変わりません。
関連
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】C++11のautoキーワードはどこまでがやりすぎ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】変数やフィールドがvoid宣言されている