2015-09-21 11 views
8

私はループベースのrangedベースのautoはオプションのキーワードですか?

"there is no need for auto inside range-based for loops. It would not be ambiguous in the language if we were to remove it."

が真の文ということです、誰かが一度私に言って思い出しますか?
フォローコードは有効なC++構文ですか?

for (elem : range){...} 

私は、これはすでに有効な構文だったと仮定していたが、私は
clang++ --std=c++1zでコンパイルに行ったとき、私は次のエラーが示された。

range-based for loop requires type for loop variable 
for (elem: range){ 

コンパイラはまだレンジ・としてこれを認識し、 forループを使っているので、なぜ型も派生できないのですか?

+0

これは、C++での導入のために議論された17。この提案が理にかなっているためには、構文が明白なままであるという主張がなされなければならなかった。これは引用がするものである。しかし、現在の状況はどういうものか分かりません。 – 5gon12eder

+1

@ 5gon12eder:私はそれが多くの懸念を抱いていたと思っています。特に、名前のシャドーイングに関する質問(例えば、 'elem'が既にスコープ内の名前であるかどうか、誰かが後でそれを追加するかどうかなど)。 –

+0

この構文はStephan Tこれは '-std = C++ 1z'の一部として実装されましたが、提案が却下されたときにはおそらく(おそらく) – Praetorian

答えて

2

これは、文は、それが純粋に仮想的な状況ではなく、実際の言語のルールについて話していることを意味し、仮定法の場合には書かれている...本当に

ELLについて質問です。仮説は、反動的な状況に使用される。

+1

言語の規則について質問していますが、言語の一部でない場合答えはちょうど「いいえ」と思う。しかし、プロポーザルが一挙に飛び出し、C++の成長が加速する中で、これが既に言語で定義されているかどうか、コンパイラーが追いつくだけでよいかどうかはわかりません。 –

+0

@TrevorHickey:C++ 1zはまだ編集中です。最新のドラフト(https://isocpp.org/std/the-standard、左上隅)について質問していますか? –

+0

ええ、最新ドラフト。今後これが本当にサポートされることを確認します。 –

4

構文は、それはautoだ場合でも、範囲のための文のタイプが必要です。 for (elem : range) {...}は構文エラーです。したがって、技術的には、はい、それはfor (auto elem : range) {...}に相当すると言えるでしょう。

は、しかし、それと少なくとも2つの大きな問題があります。

最初はfor (T elem : range)autoを使用するTを必要としないことです。コンパイラがfor (elemを見ると、外側のスコープのelemtypedefか新しく宣言された変数かどうかを知る方法はまだありません。あいまいではありませんが、コンパイラが正しく処理するには少し複雑です。

秒あなたは、デフォルトがどうあるべきかの疑問を得ることです。合法的な議論はautoのためになされるかもしれない。合法的な議論はauto &のためになされるかもしれません。合法的な議論はconst auto &のためになされるかもしれない。現在のアプローチでは、プログラマが選択できるだけです。合法的な論拠はおそらくautoで置き換えられた人のうちのいくつかに対してdecltype(auto)で置き換えられているかもしれません。

+0

多くの(たぶんほとんどの場合であっても) 'auto'は最良の選択肢ではないので、暗黙的なデフォルトであってはいけません。 –

9

for (elem : range){...} 

構文が現在有効ではありませんが、この有効な構文を作るための提案があって構文がGCC 5.2(see it live)でサポートされています。

#include <vector> 

int main() 
{ 
    std::vector<int> v ; 

    for(elem : v) 
    { 
    } 
} 

とこれをC++ 14モードで試してみると、

これは明らかに機能し、gccで実装されています。この機能はgcc 6.0で削除されたようです。

は私の知る限り、これを言うことができるようにproposal N3853: Range-Based For-Loops: The Next Generationが受け入れられるだろうが、それが拒否されたことを期待して更新されたバージョンN3994とGCCで実装されました言う:

This updates N3853 (see [1]) which proposed the syntax "for (elem : range)", by adding support for attributes and answering additional questions. Please see the original proposal for the rationale behind this feature, which is not repeated here.

我々は、それがEWG issue 81から拒否された見ることができますUrbana meeting minutesからもこれを見ることができます。提案には多くの問題がありますが、STLは提案の質問と回答のセクションで説得力のある議論を行い、提案が拒否されたことに失望しました。

+0

好奇心から、無名ラムダパラメータが拒絶されたことに失望しましたか? '[](x、y){}'などです。 – chris

+0

@chris [N3559の付録B](http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3559.pdf)で提起された問題は、私にとって本当の問題として受け入れやすいようですおそらく私はN3994への反対のいくつかの詳細を見逃しています。 –

+0

True、私はラムダのコンセプトを忘れていましたが、レンジベースのforループではそれほど有用ではありませんでした。私は特にループ型省略を好きでした。 – chris

関連する問題