As far as I understand, C++14 introduced std::make_unique
because, as a result of the parameter evaluation order not being specified, this was unsafe:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Explanation: if the evaluation first allocates the memory for the raw pointer, then calls g()
and an exception is thrown before the std::unique_ptr
construction, then the memory is leaked.)
Calling std::make_unique
was a way to constrain the call order, thus making things safe:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Since then, C++17 has clarified the evaluation order, making Syntax A safe too, so here's my question: is there still a reason to use std::make_unique
over std::unique_ptr
's constructor in C++17? Can you give some examples?
As of now, the only reason I can imagine is that it allows to type MyClass
only once (assuming you don't need to rely on polymorphism with std::unique_ptr<Base>(new Derived(param))
). However, that seems like a pretty weak reason, especially when std::make_unique
doesn't allow to specify a deleter while std::unique_ptr
's constructor does.
And just to be clear, I'm not advocating in favor of removing std::make_unique
from the Standard Library (keeping it makes sense at least for backward compatibility), but rather wondering if there are still situations in which it is strongly preferred to std::unique_ptr