Наскільки я розумію, 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 уточнив порядок оцінки, зробивши Синтаксис A також безпечним, тому ось моє запитання: чи є ще причина використовувати конструктор std::make_uniqueover std::unique_ptrу C ++ 17? Ви можете навести кілька прикладів?
Наразі єдиною причиною, яку я можу уявити, є те, що вона дозволяє друкувати MyClassлише один раз (припускаючи, що вам не потрібно покладатися на поліморфізм за допомогою std::unique_ptr<Base>(new Derived(param))). Однак це здається досить слабкою причиною, особливо коли std::make_uniqueне дозволяє вказати видалювач, тоді як std::unique_ptrконструктор робить це.
І, щоб було зрозуміло, я не виступаю за вилучення std::make_uniqueзі Стандартної бібліотеки (зберігаючи це має сенс принаймні для зворотної сумісності), а навпаки, цікавлячись, чи існують ситуації, в яких настійно кращеstd::unique_ptr
std::unique_ptr? Це не аргумент протиmake_unique