ด้านล่างเป็นสองกรณีทดสอบสำหรับพฤติกรรมที่ไม่ได้กำหนดซึ่งแสดงเป็น 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