This SO Post scheint darauf hinzuweisen, dass die Sprache in der Tat die Annahme von Provisorien nur für Argumente unterstützt.Warum nicht unique_ptr nur ein temporäres akzeptieren?
Warum dann ist unique_ptr, um akzeptiert zu aliased Zeiger entworfen, wie folgt aus:
auto ptr = new Widget{};
auto uptr = std::unique_ptr<Widget>(ptr);
Warum nicht nur einschränken:
auto uptr = std::unique_ptr<Widget>(new Widget{});
Warum beschränken Sie es nicht nur auf 'std :: make_unique()' stattdessen? –
user975989
Das erste Szenario ist tatsächlich ziemlich gültig, obwohl es leicht ausnahmsweise unsicher werden könnte, wenn mehr Code zwischen den beiden Zeilen hinzugefügt wird. Der erste Zeiger wird als Beobachterzeiger bezeichnet, während der "Aufwärtstrichter" als "Eigentümerzeiger" bezeichnet wird. Es ist nichts falsch daran, mehrere Beobachterzeiger auf dieselbe Ressource zu haben. Außerdem sollte "std :: unique_ptr" akzeptieren, Besitzrechte von vorhandenen "raw owning pointers" zu übernehmen, damit es in bestehenden Codebasen verwendet werden kann, ohne die vorhandenen APIs zu unterbrechen. – KABoissonneault
@KABoissonneault, in diesem Fall könnten Sie 'std :: unique_ptr up (std :: move (ptr));' verwenden, was anzeigt, dass Sie etwas potenziell Gefährliches tun. Siehe meine Antwort. –
alfC