2012-09-25 7 views
42

Mögliche Duplizieren:
make_unique and perfect forwardingWarum ++ C 11 haben `make_shared` aber nicht` make_unique`

Warum 11 hat C++ eine make_shared Vorlage, aber nicht ein make_unique Vorlage?

Dies macht Code sehr inkonsistent.

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

Wahrscheinlich, weil 'unique' ein Objekt konstruieren muss und sie dachten, es wäre besser, explizit zu machen –

+2

Es ist nicht der Code, der inkonsistent ist, es ist die Bibliothek. –

+1

Der Kopierkonstruktor für unique_ptr ist privat. Also funktioniert make_unique nicht ohne "Rückgabewertoptimierung". Meine Vermutung ist entsprechend der Sprachspezifikation, dass diese Optimierung nicht obligatorisch ist. – bop

Antwort

50

Nach Herb Sutter in this article war es "teilweise ein Versehen". Der Artikel enthält eine schöne Umsetzung, und macht ein starkes Argument für die Verwendung von es:

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

aktualisieren: Das ursprüngliche Update has been updated und der Schwerpunkt hat sich geändert.

+2

@hyde danke. Ich habe es aktualisiert, aber die neue Version enthält nicht die Beispielimplementierung, die in dieser Antwort enthalten ist (sie kann in den Kommentaren gefunden werden). – juanchopanza

+7

und "make_unique" wird auch in C++ 14 in der gleichen "Speicher" Header verfügbar sein http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – user2485710

+1

N3656, in C++ 14 angenommen, hat eine eigenständige Implementierung: http://isocpp.org/files/papers/N3656.txt –

Verwandte Themen