¿Por qué no hay std::make_uniqueuna plantilla de función en la biblioteca estándar de C ++ 11? Encuentro
std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
Un poco detallado. ¿No sería mucho mejor lo siguiente?
auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Esto oculta newmuy bien y solo menciona el tipo una vez.
De todos modos, aquí está mi intento de implementar make_unique:
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Me llevó bastante tiempo std::forwardcompilar las cosas, pero no estoy seguro de si es correcto. ¿Lo es? ¿Qué std::forward<Args>(args)...significa exactamente ? ¿Qué hace el compilador de eso?
make_uniquecon un Deleter costumbre, porque obviamente se asigna a través de llanura de edad newy por lo tanto debe utilizar el viejo y simple delete:)
make_uniquese limitaría a la newasignación ... bueno, está bien si quieres escribirla, pero puedo ver por qué algo así no es parte del estándar.
make_uniqueplantilla ya que el constructor de std::unique_ptres explícito y, por lo tanto, es detallado regresar unique_ptrde una función. Además, prefiero usar auto p = make_unique<foo>(bar, baz)que std::unique_ptr<foo> p(new foo(bar, baz)).
unique_ptrtoma un segundo parámetro de plantilla que de alguna manera debería permitir, que es diferenteshared_ptr.