Mengapa cabang palsu "if constexpr" dikompilasi?

Aug 18 2020

Mengapa kode ini memberikan kesalahan saat kompilasi? Pengetahuan saya (dan juga ini ) dari " if constexpr" mengatakan elseblok 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++17flag.

PS ';' yang hilang disengaja, hanya untuk memeriksa apakah elsesedang dikompilasi atau tidak.

Jawaban

7 cigien Aug 18 2020 at 20:13

Ada 2 masalah terpisah, tetapi terkait di sini.

Pertama, if constexprhanya 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 constexprtidak 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.