Почему 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.