2016-01-28 17 views
10

Utilizzo di libC++ Ho trovato la funzione di membro statico std::shared_ptr::make_shared() nella sezione pubblica. E 'molto utile quando ho già definito tipo alias alla specializzazione std::shared_ptr s':funzione membro statico make_shared di 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); 

Sono preoccupare conformità agli standard, perché gli articoli (1, 2) da fonte attendibile menziona nulla di funzione di membro static make_shared di std::shared_ptr.

È un parctice errato utilizzare la funzione attualmente? Perché?

+1

Non è il fatto che non esiste nello standard una ragione sufficiente? –

+0

Sembra che tu sappia già che questa funzione non è standard. Non è solo una domanda basata sull'opinione pubblica? – Brian

+0

Ho appena controllato le specifiche standard e non è descritto lì. Questo è simile all'implementazione specifica. Questo non funziona con la libreria standard C++ VS2015. –

risposta

5

Quando si utilizza questa funzione membro statica make_shared si dipende da un'estensione specifica dell'implementazione di g ++/la sua libreria standard, come già sapete. Per il piccolo guadagno che ne ricaverai, preferirei mantenere il mio codice portatile e usare std::make_shared.

Per il caso che hai menzionato, ovvero la costruzione di un nuovo oggetto usando copia o sposta il costruttore da uno esistente, posso suggerire un'alternativa (non testata; per la compatibilità con C++ 11 dovresti aggiungere un tipo di ritorno finale) :

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)); 
} 

Nel precedente esempio, si potrebbe quindi solo scrivere auto p = share_ptr_to_new(123).

+0

L'alternativa veramente vicina per me è [overloading] (http://coliru.stacked-crooked.com/a/f87c5e9131d5eda7) di 'make_shared' per' std :: shared_ptr' stesso da qualche parte nello spazio dei nomi utente. – Orient

3

FWIW, c'è

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

come una funzione non membro.

Dovresti essere in grado di utilizzare std::make_shared anziché std::shared_ptr::make_shared.

+0

È la massima del copy-book per me e molti altri, che si occupano di ' 'di C++ 14. – Orient

+0

@Orient, non l'ho capito. –

+1

Sincronizzazioni massime del copy-book: truismo, verità comune. – Orient

Problemi correlati