Хотя ничто не мешает вам написать свой собственный помощник, я считаю, что основная причина предоставления make_shared<T>
в библиотеке заключается в том, что она фактически создает внутренний тип общего указателя, отличный от shared_ptr<T>(new T)
, который назначается по-другому, иНет способа достичь этого без специального помощника.
С другой стороны, ваша оболочка make_unique
- это просто синтаксический сахар вокруг выражения new
, поэтому, хотя это может показаться приятным для глаз,он ничего не приносит new
в таблицу. Исправление: на самом деле это не так: наличие вызова функции для переноса выражения new
обеспечивает безопасность исключений, например, вслучай, когда вы вызываете функцию void f(std::unique_ptr<A> &&, std::unique_ptr<B> &&)
.Наличие двух необработанных new
, которые не упорядочены по отношению друг к другу, означает, что если одно новое выражение завершится неудачно с исключением, другое может привести к утечке ресурсов.Что касается того, почему в стандарте нет make_unique
: это было просто забыто.(Это иногда случается. В стандарте также нет глобального std::cbegin
, хотя он и должен быть.)
Также обратите внимание, что unique_ptr
принимает второй параметр шаблона, который вы должны как-то разрешить;это отличается от shared_ptr
, который использует стирание типа для хранения пользовательских удалителей, не делая их частью типа.