2012-09-25 13 views
42

Duplicar posibles:
make_unique and perfect forwarding¿Por qué C++ 11 tienen `` make_shared` pero no make_unique`

¿Por qué C++ 11 tienen una plantilla make_shared, pero no una make_unique plantilla?

Esto hace que el código sea muy inconsistente.

auto x = make_shared<string>("abc"); 
auto y = unique_ptr<string>(new string("abc")); 
+1

Probablemente porque 'unique' necesita construir un objeto y pensaron que era mejor hacerlo explícito –

+2

No es el código que es inconsistente, es la biblioteca. –

+1

El constructor de copia para unique_ptr es privado. Entonces make_unique no funciona sin "optimización del valor de retorno". Supongo que de acuerdo con la especificación del idioma, esta optimización no es obligatoria. – bop

Respuesta

50

Según Herb Sutter en this article fue "parcialmente un descuido". El artículo contiene una buena aplicación, y hace un caso fuerte para usarlo:

template<typename T, typename ...Args> 
std::unique_ptr<T> make_unique(Args&& ...args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

actualización: La actualización original has been updated y el énfasis ha cambiado.

+2

@hyde gracias. Lo actualicé, pero la nueva versión no tiene la implementación de muestra incluida en esta respuesta (se puede encontrar en los comentarios). – juanchopanza

+7

y 'make_unique' también estarán disponibles en C++ 14 en la misma cabecera' memory' http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – user2485710

+1

N3656, adoptado en C++ 14, tiene una implementación independiente: http://isocpp.org/files/papers/N3656.txt –

Cuestiones relacionadas