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_ptrKonstruktion eine Ausnahme ausgelöst wird , geht der Speicher verloren.)
Berufung std::make_uniquewar 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_uniqueover std::unique_ptrin C ++ 17 zu verwenden? Können Sie einige Beispiele nennen?
Der einzige Grund, den ich mir vorstellen kann, ist, dass MyClassnur 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_uniquees nicht erlaubt ist, einen Deleter anzugeben, während dies std::unique_ptrder Konstruktor tut.
Und um ganz klar zu sein, ich befürworte nicht das Entfernen std::make_uniqueaus 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