Sejauh yang saya mengerti, C ++ 14 diperkenalkan std::make_uniquekarena, 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_ptrkonstruksi, maka memori tersebut bocor.)
Menelepon std::make_uniqueadalah 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_uniqueover std::unique_ptrdi C ++ 17? Bisakah Anda memberikan beberapa contoh?
Sampai sekarang, satu-satunya alasan yang dapat saya bayangkan adalah bahwa ini memungkinkan untuk mengetik MyClasshanya 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_uniquetidak memungkinkan untuk menentukan penghapus sementara std::unique_ptrkonstruktor melakukannya.
Dan hanya untuk memperjelas, saya tidak menganjurkan untuk menghapus std::make_uniquedari 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