web-dev-qa-db-ja.com

C ++ 17はより単純な範囲ベースのForループをサポートしますか?

C++ 11以降、次のように記述できます。

vector<int> v{1, 2, 3, 4};
for (auto x : v)
{
    cout << x << endl;
}

Essentials of Modern C++ Style によると、次のコードはC++でもまもなく合法になります:

vector<int> v{1, 2, 3, 4};
for (x : v)
{
    cout << x << endl;
}

この機能はC++ 17またはC++ 20で利用できますか?

29
xmllmx

いいえ、これは委員会によって殺害されました 2年以上前 、主にシャドウイングによって引き起こされる潜在的な混乱に関する懸念のために:

std::vector<int> v = { 1, 2, 3, 4 };
int x = 0; 
for(x : v) {} // this declares a new x, and doesn't use x from the line above
assert(x == 0); // holds

異議はプロセスの後半に出されたため、ClangとGCCの両方が、完全な委員会によって拒否されるまでに機能をすでに実装していました。実装は最終的に取り消されました: Clang[〜#〜] gcc [〜#〜]

58
T.C.

これはまだ 未解決の問題 です。これをC++ 17に追加するという提案がリンクされていました。 その提案は拒否されました 。新しいプロポーザルが受け入れられるかどうかはプロポーザルに依存するため、C++ 20がそれを持っているかどうかを判断するのは時期尚早です。

4
user743382

更新

GCC 5.1では、-std = c ++ 1zでこの構文を使用できます。
GCC 6.1以降、これは許可されなくなりました。

したがって、この答えは正しくないようです。

Ideoneコンパイラは、C++ 14でこのようなコードを正常にコンパイルします。

http://ideone.com/KONqTW

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v {1, 2, 3, 4};

    for (x : v)
        cout << x << endl;

    return 0;
}
1
Qwertiy