Подтвердить что ты не робот

Будет ли С++ 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?

4b9b3361

Ответ 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;
}