เหตุใดจึงรวบรวมสาขาเท็จของ“ if constexpr”

Aug 18 2020

เหตุใดรหัสนี้จึงแสดงข้อผิดพลาดขณะคอมไพล์ ความรู้ของฉัน (และสิ่งนี้ ) เกี่ยวกับ " 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มีการรวบรวมหรือไม่

คำตอบ

7 cigien Aug 18 2020 at 20:13

มี 2 ​​ประเด็นที่แยกจากกัน แต่เกี่ยวข้องกันที่นี่

ประการแรกif constexprจะรวบรวมสาขาภายในเทมเพลตตามเงื่อนไขเท่านั้น นอกจากเทมเพลตแล้วสาขาทั้งหมดจะถูกรวบรวมและต้องมีรูปแบบที่ดี

ประการที่สองแม้ในเทมเพลตสาขาที่ถูกทิ้งif constexprจะไม่สามารถสร้างรูปแบบที่ไม่ถูกต้องสำหรับการสร้างอินสแตนซ์ที่เป็นไปได้ทั้งหมด นี่ไม่ใช่กรณีของรหัสของคุณเนื่องจาก:

int b = 10

มักจะมีรูปแบบที่ไม่ดี (เนื่องจากหายไป;)

ดังนั้นคอมไพเลอร์จึงถูกต้องในการให้ข้อผิดพลาดในการคอมไพล์ ในทางเทคนิคหากสาขาที่ถูกทิ้งมีรูปแบบที่ไม่ถูกต้องสำหรับการสร้างอินสแตนซ์ทั้งหมดคอมไพเลอร์ไม่จำเป็นต้องให้ข้อผิดพลาดของคอมไพเลอร์ แต่โค้ดยังคงผิด