2012-09-25 8 views
42

Eventuali duplicati:
make_unique and perfect forwardingPerché C++ 11 hanno `make_shared` ma non` make_unique`

Perché C++ 11 hanno un modello make_shared, ma non un Modello make_unique?

Questo rende il codice molto incoerente.

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

Probabilmente perché 'unique' ha bisogno di costruire un oggetto e hanno pensato che fosse meglio esplicito –

+2

Non è il codice che è incoerente, è la libreria. –

+1

Il costruttore di copie per unique_ptr è privato. Quindi make_unique non funziona senza "ottimizzazione del valore di ritorno". La mia ipotesi è secondo le specifiche del linguaggio questa ottimizzazione non è obbligatoria. – bop

risposta

50

Secondo Herb Sutter nel this article era "in parte una svista". L'articolo contiene una bella realizzazione, e fa un caso forte per il suo utilizzo:

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

Aggiornamento: L'aggiornamento originale has been updated e l'enfasi è cambiato.

+2

@hyde grazie. L'ho aggiornato, ma la nuova versione non ha l'implementazione di esempio inclusa in questa risposta (può essere trovata nei commenti). – juanchopanza

+7

e 'make_unique' saranno anche disponibili in C++ 14 nella stessa intestazione' memory' http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – user2485710

+1

N3656, adottato in C++ 14, ha un'implementazione standalone: ​​http://isocpp.org/files/papers/N3656.txt –

Problemi correlati