เหตุใดจึงรวบรวมสาขาเท็จของ“ if constexpr”
เหตุใดรหัสนี้จึงแสดงข้อผิดพลาดขณะคอมไพล์ ความรู้ของฉัน (และสิ่งนี้ ) เกี่ยวกับ " if constexpr
" กล่าวว่าelse
บล็อกไม่ควรรวบรวม
if constexpr (true) {
int a = 10;
} else {
int b = 10
}
ข้อผิดพลาดคือ:
error: expected ‘,’ or ‘;’ before ‘}’ token
คอมไพเลอร์ที่ใช้: g ++ เวอร์ชัน 7.5.0
ขณะคอมไพล์ฉันใช้-std=c++17
แฟล็ก
ปล.ที่หายไป ';' เป็นความตั้งใจเพียงเพื่อตรวจสอบว่าelse
มีการรวบรวมหรือไม่
คำตอบ
มี 2 ประเด็นที่แยกจากกัน แต่เกี่ยวข้องกันที่นี่
ประการแรกif constexpr
จะรวบรวมสาขาภายในเทมเพลตตามเงื่อนไขเท่านั้น นอกจากเทมเพลตแล้วสาขาทั้งหมดจะถูกรวบรวมและต้องมีรูปแบบที่ดี
ประการที่สองแม้ในเทมเพลตสาขาที่ถูกทิ้งif constexpr
จะไม่สามารถสร้างรูปแบบที่ไม่ถูกต้องสำหรับการสร้างอินสแตนซ์ที่เป็นไปได้ทั้งหมด นี่ไม่ใช่กรณีของรหัสของคุณเนื่องจาก:
int b = 10
มักจะมีรูปแบบที่ไม่ดี (เนื่องจากหายไป;
)
ดังนั้นคอมไพเลอร์จึงถูกต้องในการให้ข้อผิดพลาดในการคอมไพล์ ในทางเทคนิคหากสาขาที่ถูกทิ้งมีรูปแบบที่ไม่ถูกต้องสำหรับการสร้างอินสแตนซ์ทั้งหมดคอมไพเลอร์ไม่จำเป็นต้องให้ข้อผิดพลาดของคอมไพเลอร์ แต่โค้ดยังคงผิด