เหตุใดจึงต้องใช้ std :: make_unique ใน C ++ 17
เท่าที่ฉันเข้าใจ C ++ 14 แนะนำstd::make_uniqueเนื่องจากไม่ได้ระบุลำดับการประเมินพารามิเตอร์สิ่งนี้ไม่ปลอดภัย: f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (คำอธิบาย: หากการประเมินจัดสรรหน่วยความจำให้กับตัวชี้ดิบเป็นอันดับแรกการเรียกใช้g()และข้อยกเว้นจะเกิดขึ้นก่อนการstd::unique_ptrสร้างหน่วยความจำจะรั่วไหล) การโทรstd::make_uniqueเป็นวิธีการ จำกัด ลำดับการโทรซึ่งทำให้สิ่งต่างๆปลอดภัย: f(std::make_unique<MyClass>(param), g()); // Syntax B ตั้งแต่นั้นมา, C ++ 17 ได้ชี้แจงเพื่อการประเมินผลที่ทำให้ไวยากรณ์ปลอดภัยเกินไปดังนั้นนี่คือคำถามของฉัน: คือยังคงมีเหตุผลที่จะใช้std::make_uniqueมากกว่าstd::unique_ptr's constructor ใน C ++ 17? คุณสามารถยกตัวอย่างได้หรือไม่? ณ ตอนนี้เหตุผลเดียวที่ฉันนึกได้คืออนุญาตให้พิมพ์ได้MyClassเพียงครั้งเดียว (สมมติว่าคุณไม่จำเป็นต้องพึ่งพาความหลากหลายด้วยstd::unique_ptr<Base>(new Derived(param))) อย่างไรก็ตามนั่นดูเหมือนเป็นเหตุผลที่ค่อนข้างอ่อนแอโดยเฉพาะอย่างยิ่งเมื่อstd::make_uniqueไม่อนุญาตให้ระบุ deleter ในขณะที่ตัวstd::unique_ptrสร้างทำ และเพื่อความชัดเจนฉันไม่สนับสนุนให้ลบออกstd::make_uniqueจาก Standard Library (อย่างน้อยก็เหมาะสมสำหรับความเข้ากันได้แบบย้อนหลัง) แต่ค่อนข้างสงสัยว่ายังมีสถานการณ์ที่ต้องการอย่างยิ่งstd::unique_ptr