Por lo que tengo entendido, C ++ 14 se introdujo std::make_unique
porque, 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_ptr
construcción, entonces se pierde la memoria).
Llamar std::make_unique
era 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_unique
má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 MyClass
solo 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_unique
no permite especificar un eliminador mientras que std::unique_ptr
el constructor de sí lo hace.
Y para ser claros, no estoy abogando a favor de eliminar std::make_unique
de 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