เท่าที่ฉันเข้าใจ 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
std::unique_ptr
? ไม่ใช่การโต้แย้งmake_unique