Usando libc ++ descubro std::shared_ptr::make_shared() la función de miembro estático en la sección pública. Es muy útil cuando ya he definido el alias de tipo para la especialización de std::shared_ptr:

using T = int;
using P = std::shared_ptr< T >;
auto p = P::make_shared(123); // <=> std::make_shared< T >(123)
static_assert(std::is_same< decltype(p), P >::value);

Me preocupa el cumplimiento de las normas, porque los artículos (1, 2) de una fuente confiable no menciona nada sobre la función de miembro estático make_shared de {{ X1}}.

¿Es una mala práctica utilizar la función actualmente? ¿Por qué?

11
Tomilov Anatoliy 29 ene. 2016 a las 02:20

2 respuestas

La mejor respuesta

Al usar esta función miembro estática make_shared, depende de una extensión específica de implementación de g ++ / su biblioteca estándar, como ya sabe. Por la pequeña ganancia que obtiene de él, prefiero mantener mi código portátil y usar std::make_shared.

Para el caso que mencionó, es decir, construir un nuevo objeto usando copiar o mover el constructor de uno existente, puedo sugerir una alternativa (no probada; para compatibilidad con C ++ 11, tendría que agregar un tipo de retorno final):

template <typename T>
auto share_ptr_to_new(T&& v) {
    using T2 = typename std::remove_reference<T>::type;
    return std::make_shared<T2>(std::forward<T>(v));
}

En el ejemplo anterior, puede escribir auto p = share_ptr_to_new(123).

5
Oberon 28 ene. 2016 a las 23:42

FWIW, hay

template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args);

Como una función no miembro.

Debería poder utilizar std::make_shared en lugar de std::shared_ptr::make_shared.

3
R Sahu 28 ene. 2016 a las 23:33