Насколько я понимаю, 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