ใน C ++ 20 มาตรฐานมันก็บอกว่าประเภทอาร์เรย์เป็นประเภทอายุการใช้งานโดยปริยาย
หมายความว่าอาเรย์สำหรับประเภทอายุการใช้งานที่ไม่แน่นอนสามารถสร้างได้หรือไม่? การสร้างอาเรย์โดยนัยจะไม่ทำให้เกิดการสร้างองค์ประกอบของอาเรย์?
พิจารณากรณีนี้:
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");
รหัสนี้ไม่ใช่ UB อีกต่อไปตั้งแต่ C ++ 20 หรือไม่
อาจจะเป็นวิธีนี้จะดีกว่า
//implicit creation of an array of std::string
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to the array of 10 std::string"
std::string (* sptr)[10] = std::launder(static_cast<std::string(*)[10]>(ptr));
//pointer arithmetic on an array is well defined
new (*sptr+1) std::string("second element");
1
ฉันเพิ่งทำการค้นหาผ่าน (ฉบับร่าง) C ++ 20 มาตรฐานและไม่พบสิ่งใดที่อธิบายว่าอาร์เรย์เป็น "ประเภทอายุการใช้งานโดยนัย" (และใช่ฉันค้นหาการเปลี่ยนแปลง) โปรดระบุรายละเอียดเพิ่มเติมเกี่ยวกับการอ้างสิทธิ์ของคุณ (เช่นส่วนและข้อในมาตรฐาน) ยากที่จะตอบคำถามของคุณโดยไม่สามารถค้นหาแหล่งที่มาบริบทที่เกี่ยวข้องได้โดยลำพัง
—
ปีเตอร์
@Peter : eel.is/c++draft/basic.types#9ประโยคสุดท้าย
—
geza
ฉันกำลังดู PDF open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf (เห็นได้ชัดว่าเป็นฉบับร่างการทำงานล่าสุด) และไม่มีแม้แต่ประโยคนั้น ดูเหมือนว่าคุณจะต้องค้นหาความหมายของ "ชีวิตโดยปริยาย" ด้วย ฉันสงสัยว่าลิงก์ของคุณอาจเลือก "การแก้ไขที่กำลังดำเนินการ" ซึ่งยังไม่ได้ทำให้กลายเป็นฉบับร่างที่ใช้งานได้
—
ปีเตอร์
@Peter การเปลี่ยนแปลงเป็นผลมาจากการรวมP0593เป็นมาตรฐานจากการประชุมที่ปราก พวกเขายังไม่ได้เผยแพร่ร่างผลลัพธ์ แต่คุณสามารถเห็นข้อความที่ผสานในการกระทำนี้
—
walnut