ฉันจะเพิ่มรายละเอียดอีกเล็กน้อย อาร์เรย์พื้นฐานของstd::initializer_list
พฤติกรรมชนิดของเช่นเดียวกับขมับ พิจารณาคลาสต่อไปนี้:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
และการใช้งานในรหัสต่อไปนี้:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
มันพิมพ์ออกมา
ctor
dtor
barrier
ตั้งแต่ที่บรรทัดแรกอินสแตนซ์ชั่วคราวของชนิด X
จะมีการสร้าง (โดยแปลงคอนสตรัคเตอร์จาก1
) และทำลายเช่นกัน การอ้างอิงที่เก็บไว้p
นั้นห้อยต่องแต่ง
ส่วน std::initializer_list
ถ้าคุณใช้วิธีนี้:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
ดังนั้นอาร์เรย์ (ชั่วคราว) จะมีอยู่ตราบเท่าที่ l
ออก ดังนั้นผลลัพธ์คือ:
ctor
ctor
barrier
dtor
dtor
อย่างไรก็ตามหากคุณเปลี่ยนไปใช้
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
ผลลัพธ์เป็นอีกครั้ง
ctor
dtor
barrier
เนื่องจากอาร์เรย์ (ชั่วคราว) อยู่ในบรรทัดแรกเท่านั้น การอ้างอิงตัวชี้ไปยังองค์ประกอบจากl
นั้นส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด
สาธิต Live เป็นที่นี่
std::pair