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] .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
sumber
sumber
x
setelah lompat./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?).Jawaban:
Ini terbentuk buruk ketika inisialisasi tidak kosong.
Penginisialisasi membuat inisialisasi tidak kosong. Sebaliknya, ini
akan terbentuk dengan baik. Padahal peringatan biasa tentang penggunaan
x
dengan nilai tak tentu akan berlaku.sumber
Dari pernyataan goto :
sumber