คำถามนี้หมายถึงการเพิ่มP0593ให้กับC ++ 20 ฉบับร่างล่าสุด
นี่คือตัวอย่างของฉัน:
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
รหัสนี้มีการกำหนดที่ดีสำหรับอินพุตทั้งหมดภายใต้ร่างล่าสุดหรือไม่
เหตุผลที่แสดงใน P0593 ทำให้ชัดเจนว่าการไม่ใส่ความคิดเห็น[2]
จะนำไปสู่พฤติกรรมที่ไม่ได้กำหนดเนื่องจากการละเมิดนามแฝงที่เข้มงวดหากรายการอินพุตผู้ใช้สองรายการแตกต่างกัน การสร้างวัตถุโดยปริยายน่าจะเกิดขึ้นเพียงครั้งเดียว ณ จุดที่malloc
; foo
มันไม่ได้ถูกเรียกโดยคำสั่งที่ได้รับมอบหมายใน
สำหรับการรันโปรแกรมใด ๆ ที่เกิดขึ้นจริงจะมีสมาชิกของชุดออบเจ็กต์ทางอ้อมที่ไม่ระบุรายละเอียดซึ่งจะทำให้โปรแกรมมีความชัดเจน แต่ฉันยังไม่ชัดเจนว่าต้องเลือกการสร้างวัตถุโดยปริยายที่กล่าวถึงใน [intro.object] / 10 เมื่อmalloc
เกิดเหตุการณ์ขึ้นหรือไม่ หรือการตัดสินใจสามารถ "เดินทางข้ามเวลา"
ปัญหาเดียวกันอาจเกิดขึ้นสำหรับโปรแกรมที่อ่านไบนารีบล็อบลงในบัฟเฟอร์จากนั้นทำการตัดสินใจรันไทม์ของวิธีการเข้าถึง (เช่นการดีซีเรียลไลเซชัน