Розглянемо цей код:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC і Clang відкидають це , оскільки перехід на bar:обхід ініціалізації змінної. MSVC взагалі не скаржиться (крім використання xпісля bar:викликає попередження).
Ми можемо зробити аналогічну річ із switch:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Тепер усі три компілятори видають помилки .
Ці фрагменти погано сформовані? Або вони викликають UB?
Раніше я думав, що обидва були недобре сформовані, але не можу знайти належних частин стандарту. [stmt.goto] нічого про це не говорить, а також [stmt.select] .
/permissive-прапор до MSVC, і він також скаржиться. Я не знаю, хоча чітко визначена поведінка MSVC без цього прапора (я б припустив, інакше навіщо вони це дозволять?).
xпісля стрибка.