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

Ошибка GCC в заявке на основе диапазона

Кажется, я столкнулся с странной ошибкой в ​​GCC. Рассмотрим

for (int i = 5 : {1, 2, 3})
     std::cout << i << ", ";

Пока этот бессмысленный код корректно отклонен Кланом, он компилирует и отлично работает во всех последних версиях GCC. Странно то, что никакого выхода вообще не будет, ни 1, 2, 3, ни 5, 5, 5.

Если мы идем дальше и рассмотрим этот код

int arr[] {1, 2, 3};
for (int i = 5: arr)
    std::cout << i << ", ";

GCC предупреждает нас что массив не используется, что подразумевает, что цикл игнорируется.

Этот код вызывает поведение undefined? Или это плохо сформировано, без необходимости диагностики? Или это просто странная ошибка?
Стандарт указывает в [stmt.ranged]/1, что декларация подставляется в следующую строку:

для объявления диапазона = *__begin;

... и такая декларация явно была бы плохо сформирована.

Изменить: после сообщив об ошибке, Паоло Карлини исправил его для версии 5.0.

4b9b3361

Ответ 1

Оба примера - это недопустимый синтаксис, который требует диагностики.

Синтаксис для range-based for равен 6.5/1:

итерация-оператор:

  • ...
  • for ( for-range-declaration : оператор for-range-initializer )

для диапазона декларирования:

  • attribute-specifier-seq opt decl-specifier-seq declarator

который не позволяет инициализировать перед двоеточием.