Just to clarify, using make_unique only adds exception safety when you have multiple allocations in an expression, not just one, correct? For example
As of C++17, the exception safety issue is fixed by a rewording of [expr.call]
The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter.
Here indeterminately sequenced means that one is sequenced before another, but it is not specified which.
f(unique_ptr(new T), function_that_can_throw());
Can have only two possible order of execution
new T unique_ptr::unique_ptr function_that_can_throwfunction_that_can_throw new T unique_ptr::unique_ptr Which means it is now exception safe.