Pertimbangkan kode ini:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC dan Dentang menolaknya , karena lompatan untuk bar:
mem - bypass inisialisasi variabel. MSVC tidak mengeluh sama sekali (kecuali menggunakan x
setelah bar:
menyebabkan peringatan).
Kita dapat melakukan hal serupa dengan switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Sekarang ketiga kompiler memancarkan kesalahan .
Apakah potongan-potongan itu buruk bentuknya? Atau apakah mereka menyebabkan UB?
Dulu saya berpikir bahwa keduanya buruk bentuknya, tetapi saya tidak dapat menemukan bagian-bagian standar yang jelas. [stmt.goto] tidak mengatakan apa-apa tentang ini, dan begitu pula [stmt.select] .
/permissive-
bendera ke MSVC dan itu akan mengeluh juga. Saya tidak tahu apakah perilaku MSVC tanpa bendera itu didefinisikan dengan baik (saya akan berasumsi demikian, kalau tidak mengapa mereka mengizinkannya?).
x
setelah lompat.