Почему std::make_unique
в стандартной библиотеке C ++ 11 нет шаблона функции? я нахожу
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
немного многословно Разве следующее не будет намного лучше?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Это new
хорошо скрывает и упоминает тип только один раз.
Во всяком случае, вот моя попытка реализации make_unique
:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Мне потребовалось много времени, чтобы собрать std::forward
материал для компиляции, но я не уверен, что это правильно. Это? Что именно std::forward<Args>(args)...
значит? Что компилятор делает из этого?
make_unique
с помощью пользовательского удалителя, потому что очевидно, что он выделяется через обычный старый new
и, следовательно, должен использовать простой старый delete
:)
make_unique
будет ограничено new
распределением ... ну, если вы хотите написать его, хорошо, но я понимаю, почему что-то подобное не является частью стандарта.
make_unique
шаблон, поскольку конструктор std::unique_ptr
явно, и поэтому он является многословным, чтобы вернуться unique_ptr
из функции. Кроме того, я бы лучше использовал, auto p = make_unique<foo>(bar, baz)
чем std::unique_ptr<foo> p(new foo(bar, baz))
.
unique_ptr
принимает второй параметр шаблона, который вы должны как-то учитывать - это отличается отshared_ptr
.