Por lo que tengo entendido, C ++ 14 se introdujo std::make_uniqueporque, como resultado de que no se especificaba el orden de evaluación de parámetros, esto no era seguro:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Explicación: si la evaluación primero asigna la memoria para el puntero sin procesar, luego llama g()y se lanza una excepción antes de la std::unique_ptrconstrucción, entonces se pierde la memoria).
Llamar std::make_uniqueera una forma de restringir el orden de las llamadas, haciendo las cosas seguras:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Desde entonces, C ++ 17 ha aclarado el orden de evaluación, haciendo que la sintaxis A también sea segura, así que aquí está mi pregunta: ¿todavía hay una razón para usar std::make_uniquemásstd::unique_ptr el constructor de en C ++ 17? ¿Puede dar algunos ejemplos?
A partir de ahora, la única razón que puedo imaginar es que permite escribir MyClasssolo una vez (asumiendo que no necesita depender del polimorfismo con std::unique_ptr<Base>(new Derived(param))). Sin embargo, eso parece una razón bastante débil, especialmente cuando std::make_uniqueno permite especificar un eliminador mientras que std::unique_ptrel constructor de sí lo hace.
Y para ser claros, no estoy abogando a favor de eliminar std::make_uniquede la Biblioteca estándar (mantenerlo tiene sentido al menos para la compatibilidad con versiones anteriores), sino más bien me pregunto si todavía hay situaciones en las que se prefiere fuertementestd::unique_ptr
std::unique_ptr? No es un argumento en contramake_unique