-
make_unique teaches users “never say new/delete and
new[]/delete[]” without disclaimers.
-
make_unique shares two advantages with make_shared (excluding the third advantage, increased efficiency). First, unique_ptr<LongTypeName> up(new LongTypeName(args)) must mention LongTypeName twice, while auto up = make_unique<LongTypeName>(args) mentions it once.
-
make_unique prevents the unspecified-evaluation-order
leak triggered by expressions like foo(unique_ptr<X>(new X), unique_ptr<Y>(new Y)). (Following the advice “never say new” is simpler than
“never say new, unless you immediately give it to a named unique_ptr“.)
-
make_unique is carefully implemented for exception safety and is recommended over directly calling unique_ptr constructors.