GCC ล้มเหลวในการรายงานการโทรแลมบ์ดาแบบ constexpr ที่ไม่เหมาะสม


9

ด้านล่างเป็นสองกรณีทดสอบสำหรับพฤติกรรมที่ไม่ได้กำหนดซึ่งแสดงเป็น IIFE (เรียกว่า Lambda-Axpression ทันที):

constexpr auto test3 = []{
    int* p{};
    {   
        int x{};
        p = &x;
    }
    return *p; // Undefined Behaviour
}(); // IIFE

constexpr auto test4 = []{
    int x = std::numeric_limits<int>::min();
    int y = -x;  // Undefined Behaviour
    return y;
}();

int main() {}

เมื่อรวบรวมกับ GCC ลำต้นtest4ถูกปฏิเสธอย่างถูกต้องในขณะที่มัน exhibs constexprพฤติกรรมที่ไม่ได้กำหนดใน ในทางกลับกันtest3เป็นที่ยอมรับ

GCC มีสิทธิ์ที่จะยอมรับtest3หรือไม่


4
@ เดิมที่รู้จักกัน _463035818 มาตรฐานกำหนดให้ UB ทั้งหมดใน constexpr ได้รับการวินิจฉัย
NathanOliver

@ NathanOliver โอ้ขอบคุณ นั่นเป็นวิธีที่ฉันเรียนรู้ฉันทำผิดพลาด)
idclev 463035818

อ๋อ ดูเหมือนว่าข้อผิดพลาด GCC
NathanOliver

ฉันจะรายงาน
wimalopaan

คำตอบ:


7

GCC เหมาะสมที่จะรับการทดสอบ 3 หรือไม่?

ไม่นี่เป็นข้อผิดพลาดของ GCC ฉันเพิ่งรายงานว่ามันเป็นข้อผิดพลาด #


ขอบคุณสำหรับความคล่องตัวในการตั้งคำถามและคำตอบ!
wimalopaan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.