Sejauh yang saya mengerti, C ++ 14 diperkenalkan std::make_unique
karena, sebagai hasil dari urutan evaluasi parameter tidak ditentukan, ini tidak aman:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Penjelasan: jika evaluasi pertama-tama mengalokasikan memori untuk pointer mentah, kemudian panggilan g()
dan pengecualian dilemparkan sebelum std::unique_ptr
konstruksi, maka memori tersebut bocor.)
Menelepon std::make_unique
adalah cara untuk membatasi urutan panggilan, sehingga membuat semuanya aman:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Sejak itu, C ++ 17 telah mengklarifikasi urutan evaluasi, membuat Sintaks A aman juga, jadi inilah pertanyaan saya: apakah masih ada alasan untuk menggunakan konstruktor std::make_unique
over std::unique_ptr
di C ++ 17? Bisakah Anda memberikan beberapa contoh?
Sampai sekarang, satu-satunya alasan yang dapat saya bayangkan adalah bahwa ini memungkinkan untuk mengetik MyClass
hanya sekali (dengan asumsi Anda tidak perlu bergantung pada polimorfisme dengan std::unique_ptr<Base>(new Derived(param))
). Namun, itu sepertinya alasan yang cukup lemah, terutama ketika std::make_unique
tidak memungkinkan untuk menentukan penghapus sementara std::unique_ptr
konstruktor melakukannya.
Dan hanya untuk memperjelas, saya tidak menganjurkan untuk menghapus std::make_unique
dari Perpustakaan Standar (menjaganya setidaknya masuk akal untuk kompatibilitas ke belakang), tetapi bertanya-tanya apakah masih ada situasi di mana itu sangat disukai untukstd::unique_ptr
std::unique_ptr
? Ini bukan argumen untuk dilawanmake_unique