Будет ли С++ 17 поддерживать более простой диапазон для цикла?
Так как С++ 11, мы можем написать:
vector<int> v{1, 2, 3, 4};
for (auto x : v)
{
cout << x << endl;
}
Согласно Основы современного стиля С++, следующий код вскоре будет также законным в С++:
vector<int> v{1, 2, 3, 4};
for (x : v)
{
cout << x << endl;
}
Будет ли эта функция доступна в С++ 17 или С++ 20?
Ответы
Ответ 1
Нет. Это было убито комитетом более двух лет назад, главным образом из-за опасений относительно возможной путаницы, вызванной затенением:
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
Ответ 2
Это по-прежнему открытая проблема. Было добавлено предложение, связанное с ним, чтобы добавить это в С++ 17. Это предложение было отклонено. Будет ли новое предложение приниматься, зависит от предложения, поэтому он слишком скоро должен сказать, может ли С++ 20 иметь его.
Ответ 3
Обновление
GCC 5.1 разрешает этот синтаксис с -std = С++ 1z.
Это больше не допускается с GCC 6.1.
Итак, этот ответ кажется неправильным.
Идейный компилятор успешно компилирует такой код под С++ 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;
}