Anladığım kadarıyla, C ++ 14 tanıtıldı std::make_unique
çünkü parametre değerlendirme sırasının belirtilmemesi nedeniyle bu güvenli değildi:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Açıklama: Eğer değerlendirme önce hafızayı ham işaretçi için ayırırsa, sonra çağırır g()
ve yapımdan önce bir istisna atılırsa std::unique_ptr
, hafıza sızdırılır.)
Arama std::make_unique
, arama sırasını kısıtlamanın bir yoluydu ve böylece işleri güvenli hale getiriyordu:
f(std::make_unique<MyClass>(param), g()); // Syntax B
O zamandan beri, C ++ 17 değerlendirme sırasını netleştirdi ve Sözdizimi A'yı da güvenli hale getirdi, işte sorum şu: C ++ 17'de over yapıcısını kullanmak için hala bir neden var mı? Bazı örnekler verebilir misiniz?std::make_unique
std::unique_ptr
Şu an için, hayal edebildiğim tek neden, MyClass
yalnızca bir kez yazmaya izin vermesidir (polimorfizme güvenmeniz gerekmediğini varsayarak std::unique_ptr<Base>(new Derived(param))
). Bununla birlikte, bu oldukça zayıf bir neden gibi görünüyor, özellikle std::make_unique
kurucunun yaptığı sırada bir silici belirtmeye izin std::unique_ptr
vermediğinde.
Ve daha açık olmak std::make_unique
gerekirse, Standart Kitaplık'tan çıkarılmayı savunmuyorum (en azından geriye dönük uyumluluk için mantıklıdır), daha ziyade hala şiddetle tercih edilenstd::unique_ptr
std::unique_ptr
? Karşımake_unique