Кажется, я столкнулся с странной ошибкой в 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.