Рассмотрим этот код:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
G CC и Clang отклоняют его , поскольку переход к bar:
обходит инициализацию переменной. MSV C не жалуется вообще (кроме использования x
после bar:
вызывает предупреждение).
Мы можем сделать то же самое с switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Теперь все три компилятора выдают ошибки .
Эти фрагменты плохо сформированы? Или они вызывают UB?
Раньше я думал, что оба были плохо сформированы, но я не могу найти соответствующие части стандарта. [stmt.goto] ничего не говорит об этом, и при этом [stmt.select] .