C++ 将C++;17支持更简单的基于范围的For循环?

C++ 将C++;17支持更简单的基于范围的For循环?,c++,c++11,standards,C++,C++11,Standards,从C++11开始,我们可以编写: vector<int> v{1, 2, 3, 4}; for (auto x : v) { cout << x << endl; } 向量v{1,2,3,4}; 用于(自动x:v) { 库特 更新 GCC 5.1允许使用-std=c++1z的这种语法。 自GCC 6.1以来,不再允许这样做 所以这个答案似乎不正确 编译程序编译成功,在C++ 14中编译: #包括 #包括 使用名称空间std; int main()

从C++11开始,我们可以编写:

vector<int> v{1, 2, 3, 4};
for (auto x : v)
{
    cout << x << endl;
}
向量v{1,2,3,4};
用于(自动x:v)
{
库特
更新

GCC 5.1允许使用-std=c++1z的这种语法。
自GCC 6.1以来,不再允许这样做

所以这个答案似乎不正确

编译程序编译成功,在C++ 14中编译:

#包括
#包括
使用名称空间std;
int main()
{
向量v{1,2,3,4};
对于(x:v)

coutNo。这是委员会扼杀的,主要是因为担心阴影可能造成混乱:

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
std::vector v={1,2,3,4};
int x=0;
对于(x:v){}//这声明了一个新的x,并且不使用上面一行中的x
断言(x==0);//保持

在这个过程中,反对意见提出得太晚了,以至于Clang和GCC在被全体委员会拒绝时都已经实现了该功能。这些实现最终被放弃了:

这仍然是。有一个建议链接到这里,将其添加到C++17中。新的建议是否会被接受取决于proposal,所以现在说C++20是否可能拥有它还为时过早。

不,不会。尽管如此,在我看来,这并不简单,而是更令人困惑。@DeiDei需要引用。到目前为止,这只是你反对Herb Sutter的言论。@DeiDei,@hvd这是2016年某人的言论反对2014年某人的言论…@Qwertiy好吧,经过一段时间之后重新研究…Ideone使用的编译器是GCC 5.1,它允许使用-std=c++1z的语法。这是不允许的,因为GCC 6.1.Eh?仍处于打开状态,并表示“作者将要修改”@hvd EWG问题清单已经一年多没有更新了。IIRC STL没有积极进行任何修订。无论如何,委员会似乎不会接受任何至少与声明不符的内容。哦……这真的很不幸,不管提案的优点如何。重要的是,我们要ep列出的是最新的。@Qwertiy这是一个完全不同的问题,但不是,这是无效的。基于范围的
for
的语法需要声明,而不仅仅是表达式。@LightnessRacesinOrbit:另一方面,标准化过程从实现经验中受益匪浅。因为它更容易删除一些内容从编译器(特别是隐藏在非标准标志后面)而不是从标准,我认为这里发生了正确的事情。
#include <iostream>
#include <vector>

using namespace std;

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

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

    return 0;
}
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