2011-09-28 13 views
90

私がC++を学ぶのに使ったすべての資料から、autoは、いつも何の役にも立たない奇妙な記憶期間指定子でした。しかし、ちょうど最近、タイプ名として使用されたコードに遭遇しました。私はそれを試してみました。好奇心のせいで、私はそれに割り当てられたもののタイプを仮定しています!C++自動キーワード。なぜそれは魔法ですか?

突然、STLイテレータと、まったく、テンプレートを使用するものは、10倍も簡単に書き込むことができます。 Pythonのような「楽しい」言語を使っているような気がします。

どこのキーワードが私の一生だったのですか?あなたは私の夢をビジュアルスタジオ専用かポータブルではないと言ってぶつけますか?

+10

です。マジック。それは新しい(_oh noes、悪いpun_)。今非同期は未来(_gasp_) – sehe

+1

ここには、自動キーワードhttp://en.cppreferenceに関するリファレンスがあります。co.jp/w/cpp/language/auto – andyqee

答えて

80

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

autoを演繹型とすることは、C++ 11(以前はC++ 0xと呼ばれていました)では新しいものです。非常に最近C++ 11の標準が公開されて以来、(まだ)それを理解するために更新されていないコンパイラが残っているかもしれません。

同時に、auto xは、テンプレートテンプレートの減算が機能テンプレートと同じように機能します。 A点で

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

は、タイプがwhateverにパラメータに渡された値に基づいてTに割り当てられている。このような関数テンプレートを考えてみましょう。 auto x = some_expression;を実行する場合、本質的に同じタイプの推論メカニズムを使用して、のタイプを、それを初期化するために使用されるタイプsome_expressionから決定します。

これは、コンパイラが実装する必要があるほとんどの型減算力学がautoであり、C++ 98/03を実装しようとするような種類のコンパイラでもテンプレートに使用されていることを意味します。そのため、C++ 11をまだサポートしていないコンパイラでも、autoのサポートを追加すると、おそらくとなります。はすばやく簡単です。

この回答が最初に書かれたとき(2011年にインクがC++ 11標準で乾く前)、autoはすでにかなり移植性がありました。今日では、すべての主流のコンパイラの間で完全に移植可能です。それを避ける唯一の明白な理由は、Cコンパイラと互換性のあるコードを書く必要がある場合、またはそれをサポートしていないことがわかっている一部のニッチコンパイラを特定する必要がある場合です(たとえば、 Borland、Watcomなどのコンパイラを使用してMS-DOS用に開発されました。

10

この機能はあなたの人生にはありませんでした。 2010年版以降、Visual Studioでサポートされています。これは新しいC++ 11の機能なので、Visual Studio専用ではなく、移植可能です。ほとんどのコンパイラはすでにそれをサポートしています。

18

これは一般的に役に立たないキーワードを取り、それに新しい、より良い機能を与えているだけです。これはC++ 11の標準であり、ほとんどのC++コンパイラでもC++ 11のサポートがサポートされます。

+0

ああ!ああ、決してC++の言語を、それ自体で変わる可能性のあるものと考えたことはありません。私はこのC++ 11で何が追加されたのか調べなければならないだろう。 –

+6

@Clairvoire C++ 0xは暫定的な名前でした。今月公開されたので、C++ 11になりました。 –

3

これはどこにもありません... C++ 11の実装における新しい標準C++機能です。つまり、オブジェクト宣言を簡素化し、特定の呼び出しパラダイム(つまり範囲ベースのfor-loops)の構文を整理するための素晴らしいツールですが、過剰使用/乱用しないでください:-)

5

変数の場合、宣言されている変数の型が初期化子から自動的に導出されるように指定します。関数の場合、戻り値の型が末尾の戻り値の型か、またはC++ 14以降の戻り値から導かれることを指定します。

構文

auto variable initializer (1) (since C++11) 

auto function -> return type (2) (since C++11) 

auto function (3) (since C++14) 

decltype(auto) variable initializer (4) (since C++14) 

decltype(auto) function (5) (since C++14) 

auto :: (6) (concepts TS) 

cv(optional) auto ref(optional) parameter (7) (since C++14) 

説明

1)ブロックスコープ内の変数を宣言する場合、名前空間の範囲で、等forループの初期設定ステートメントで、キーワード自動を使用することができます型指定子として使用します。 初期化子の型が決定されると、コンパイラは、関数呼び出しからのテンプレート引数の控除の規則を使用して、キーワードautoを置き換える型を決定します(テンプレート引数の控除#詳細はその他の文脈を参照してください)。キーワードautoには、constや&などの修飾子が付いていて、タイプ控除に参加します。たとえば、const auto& i = expr;と指定した場合、iのタイプは、f(expr)という関数呼び出しがコンパイルされた場合、架空のテンプレートtemplate<class U> void f(const U& u)の引数uのタイプとまったく同じです。したがって、自動& &は、範囲ベースのforループで使用される初期化子に従って、左辺値参照または右辺値参照のいずれかとして推定できます。 autoを使用して複数の変数を宣言する場合、推定される型は一致する必要があります。例えば、auto i = 0, d = 0.0;の宣言は不正であり、auto i = 0, *p = &i;の宣言は整形式であり、autoはintとして推定されます。

2)後続の戻り型の構文を使用する関数宣言では、キーワードautoは自動型検出を実行しません。構文の一部としてのみ機能します。

3)末尾の戻り型の構文を使用しない関数宣言では、キーワードautoは、戻り値の型がテンプレート引数の控除の規則を使用してreturn文のオペランドから導出されることを示します。

4)変数の宣言された型がdecltype(auto)の場合、キーワードautoはその初期化子の式(または式リスト)に置き換えられ、実際の型はdecltypeの規則を使用して導かれます。

5)関数の戻り値の型がdecltype(auto)と宣言されている場合、キーワードautoはreturn文のオペランドに置き換えられ、実際の戻り値の型はdecltypeの規則を使用して導出されます。

6)auto ::という形式のネストされた名前指定子は、制約型プレースホルダ控除の規則に従ってクラスまたは列挙型に置き換えられるプレースホルダです。

7)ラムダ式のパラメータ宣言。 (C++以降)関数のパラメータ宣言。 (コンセプトTS)

autoには、保存期間指定子の意味があります。 auto f() -> int, i = 0;のように、1つの宣言で自動変数と関数を混在させることはできません。

詳細についてはhttp://en.cppreference.com/w/cpp/language/auto

+1

コード例にはおそらくコードブロックを使用するべきです – KABoissonneault

関連する問題