Mengapa cabang palsu "if constexpr" dikompilasi?
Mengapa kode ini memberikan kesalahan saat kompilasi? Pengetahuan saya (dan juga ini ) dari " if constexpr
" mengatakan else
blok tidak boleh dikompilasi.
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
Kesalahannya adalah:
error: expected ‘,’ or ‘;’ before ‘}’ token
Kompiler yang digunakan: g ++ versi 7.5.0
Saat kompilasi saya menggunakan -std=c++17
flag.
PS ';' yang hilang disengaja, hanya untuk memeriksa apakah else
sedang dikompilasi atau tidak.
Jawaban
Ada 2 masalah terpisah, tetapi terkait di sini.
Pertama, if constexpr
hanya akan mengkompilasi secara bersyarat cabang di dalam template. Di luar template, semua cabang akan dikompilasi dan harus dibentuk dengan baik.
Kedua, bahkan dalam template, cabang an yang dibuang if constexpr
tidak dapat dibentuk dengan buruk untuk semua kemungkinan instance. Ini tidak terjadi pada kode Anda, karena:
int b = 10
selalu berbentuk buruk (karena yang hilang ;
).
Jadi kompilator benar dalam memberikan kesalahan kompilasi. Secara teknis, jika cabang yang dibuang memiliki format yang salah untuk semua instansiasi, maka kompilator tidak perlu memberikan kesalahan kompilator, tetapi kodenya masih salah.