Ответ 1
Мотивация make_unique
в основном двукратна:
-
make_unique
безопасен для создания временных рядов, тогда как при явном использованииnew
вам нужно запомнить правило о том, что вы не используете неназванные временные файлы.foo(make_unique<T>(), make_unique<U>()); // exception safe foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*
-
Наконец, добавление
make_unique
означает, что люди могут "никогда" использоватьnew
, а не предыдущее правило, "никогда не использоватьnew
, кроме случаев, когда вы делаетеunique_ptr
".
Также есть и третья причина:
-
make_unique
не требует использования избыточного типа.unique_ptr<T>(new T())
→make_unique<T>()
Ни одна из причин не связана с повышением эффективности выполнения, как это делает использование make_shared
(из-за избежания второго выделения за счет потенциально более высокой пиковой загрузки памяти).
* Ожидается, что С++ 17 будет включать изменение правила, что означает, что это уже небезопасно. См. Документы комитета С++ P0400R0 и P0145R3.