เหตุใดจึงไม่มีstd::make_unique
เทมเพลตฟังก์ชันในไลบรารี C ++ 11 มาตรฐาน ฉันหา
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
verbose เล็กน้อย ต่อไปนี้จะดีกว่านี้ไหม
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
สิ่งนี้ซ่อนสิ่งที่new
ดีและกล่าวถึงเพียงครั้งเดียวเท่านั้น
อย่างไรก็ตามนี่คือความพยายามของฉันในการดำเนินการmake_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
ฉันใช้เวลาพอสมควรในการstd::forward
รวบรวมสิ่งต่าง ๆ แต่ฉันไม่แน่ใจว่ามันถูกต้องหรือไม่ ใช่ไหม? std::forward<Args>(args)...
หมายความว่าอะไรกันแน่? คอมไพเลอร์ทำอะไรได้บ้าง
make_unique
กับ Deleter กำหนดเองเพราะเห็นได้ชัดว่ามันจัดสรรผ่านเก่าธรรมดาnew
และด้วยเหตุนี้ต้องใช้ธรรมดาเก่าdelete
:)
make_unique
จะ จำกัด อยู่ที่การnew
จัดสรร ... ก็ดีถ้าคุณต้องการเขียน แต่ฉันสามารถเห็นได้ว่าทำไมบางอย่างเช่นนี้จึงไม่ใช่ส่วนหนึ่งของมาตรฐาน
make_unique
แม่แบบเนื่องจากตัวสร้างของstd::unique_ptr
ชัดเจนและดังนั้นจึงเป็นเรื่องที่จะกลับมาunique_ptr
จากฟังก์ชั่น นอกจากนี้ผมอยากจะใช้กว่าauto p = make_unique<foo>(bar, baz)
std::unique_ptr<foo> p(new foo(bar, baz))
unique_ptr
ใช้พารามิเตอร์แม่แบบที่สองที่คุณอย่างใดควรอนุญาตให้มี -shared_ptr
ที่แตกต่างจาก