Насколько я понимаю, в 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
над конструктором std::unique_ptr
в C ++ 17?Можете ли вы привести несколько примеров?
На данный момент единственная причина, которую я могу себе представить, состоит в том, что она позволяет набирать MyClass
только один раз (при условии, что вам не нужно полагаться на полиморфизм с * 1021).*).Однако это кажется довольно слабой причиной, особенно когда std::make_unique
не позволяет указывать удалитель, в то время как конструктор std::unique_ptr
делает.
И, чтобы было ясно, я не защищаю ввыступает за удаление std::make_unique
из стандартной библиотеки (сохранение его имеет смысл, по крайней мере, для обратной совместимости), но скорее задается вопросом, существуют ли еще ситуации, в которых настоятельно рекомендуется std::unique_ptr