Gibt es einen Grund für den Unterschied?
Nein, gibt es nicht. Genau wie bei make_unique
ist dies eine "Aufsicht" und sollte in Zukunft hinzugefügt werden (wenn jemand die Mühe hat, einen Vorschlag zu senden).
In der Zwischenzeit können Sie die Ausgabe ptr.get()
statt, oder - falls keine Angst vor undefinierten Verhalten:
#if __cplusplus <= 201600 // Some time in future
namespace std {
template <class E, class T, class Y, class D>
basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os,
unique_ptr<Y, D> const& p) {
return os << p.get();
}
}
#endif
Das nach [namespace.std] nicht definiert ist:
von
Das Verhalten Ein C++ - Programm ist nicht definiert, wenn Deklarationen oder Definitionen zu Namespace std
[...] hinzugefügt werden, es sei denn, ist anders angegeben.
... und das oben Genannte ist in dieser Angelegenheit nicht ausdrücklich erlaubt. Dieses undefinierte Verhalten ist jedoch in Ordnung und kann ohne jegliche Auswirkungen aufgerufen werden.
Ich bin mir nicht sicher, ob diese Frage beantwortbar ist. Der Grund ist, dass niemand es (noch) in den Standard aufgenommen hat, aber wollten Sie das hören? –
@KerrekSB Vermutlich möchte er nur bestätigen, dass es "make_unique" ähnlich ist. – Columbo
@KerrekSB Das ist eigentlich eine Antwort. Ich glaube, die Frage ist "Gibt es dafür einen fundamentalen Grund oder ist es nur eine Auslassung?" – Angew