Soweit ich weiß, wurde C ++ 14 eingeführt std::make_unique
, da dies aufgrund der nicht angegebenen Reihenfolge der Parameterauswertung unsicher war:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Erläuterung: Wenn die Auswertung zuerst den Speicher für den Rohzeiger zuweist, dann aufruft g()
und vor der std::unique_ptr
Konstruktion eine Ausnahme ausgelöst wird , geht der Speicher verloren.)
Berufung std::make_unique
war ein Weg , um den Anruf zu beschränken, damit die Dinge sicher:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Seitdem hat C ++ 17 die Auswertungsreihenfolge geklärt und Syntax A auch sicher gemacht. Hier ist meine Frage: Gibt es noch einen Grund, den Konstruktor von std::make_unique
over std::unique_ptr
in C ++ 17 zu verwenden? Können Sie einige Beispiele nennen?
Der einzige Grund, den ich mir vorstellen kann, ist, dass MyClass
nur einmal getippt werden kann (vorausgesetzt, Sie müssen sich nicht auf Polymorphismus verlassen std::unique_ptr<Base>(new Derived(param))
). Dies scheint jedoch ein ziemlich schwacher Grund zu sein, insbesondere wenn std::make_unique
es nicht erlaubt ist, einen Deleter anzugeben, während dies std::unique_ptr
der Konstruktor tut.
Und um ganz klar zu sein, ich befürworte nicht das Entfernen std::make_unique
aus der Standardbibliothek (es ist zumindest aus Gründen der Abwärtskompatibilität sinnvoll, dies beizubehalten), sondern frage mich, ob es noch Situationen gibt, in denen dies stark bevorzugt wirdstd::unique_ptr
std::make_unique
überhaupt keinen gäbe, denke ich nicht, dass dies Grund genug wäre, ihn der STL hinzuzufügen, insbesondere wenn es sich um eine Syntax handelt, die weniger aussagekräftig ist als die Verwendung des Konstruktors, nicht mehr
std::unique_ptr
? Es ist kein Argument gegenmake_unique