Розглянемо цей код:
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
після стрибка.