Ich unterstütze ziemlich viel die Idee, std::shared_ptr<T>
Konstruktor zu machen, der T *
ausdrücklich akzeptiert. Es hilft, schlaflose Nacht zu sparen, wenn Sie den Grund auf Haufen Korruption suchen. Scott Meyers gab eine gute Erklärung dafür.std :: shared_ptr <T>: impliziter Konstruktor für rvalue Zeiger auf T
Aber ... Wenn ich es ein rvalue
Zeiger geben, ist dies nicht ausdrücklich? Ich konnte Dinge tun, wie:
/// (1)
std::shared_ptr<T> t = new T;
oder
/// (2)
T * giveaway = new T;
std::shared_ptr<T> t = std::move(giveaway);
oder ein viel schmerzhafter Fall aus dem wirklichen Leben
/// (3)
void foo(std::shared_ptr<T> t);
/// ...
foo(new T);
Was mich betrifft, alle diese Fälle sind deutlich genug .
Fall (1) ist ein prvalue
, ich kann mich möglicherweise nicht mit zwei Zeigern vermasseln. Mindestens nicht mehr als mit:
std::shared_ptr<T> t{new T};
Fall (2) ist ziemlich explizit. Es ist vereinbart, dass nachdem du etwas bewegt hast, sein Wert undefiniert wird. Also, es ist total auf dich.
Fall (3) ist wieder ein rvalue
.
(Q1) Es ist dies ein übersehen durch Standardkomitee?
(Q2) Gibt es einen Grund dafür?
(Q3) Gibt es eine Chance, dass der implizite Konstruktor rvalue
in C++ 14 angezeigt wird?
Zu Q3: C++ 14 ist offiziell, und das hat sich nicht geändert. – Deduplicator
Habe ich etwas verpasst? Warum nicht make_shared verwenden? –
@MarcoA.Aus demselben Grund verwenden wir nicht 'std :: string (" literal ")' überall dort, wo wir Literal übergeben, um zu funktionieren, das 'std :: string' akzeptiert. Es ist Einfachheit. – GreenScape