Наскільки я розумію, 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_unique
over 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