Die kommentierte Zeile: bar(foo())
kompiliert nicht, da der Balken nichtkonstante Referenz akzeptiert und foo
returns rvalue zurückgibt. Aber die zweite Zeile mit std::auto_ptr
kompiliert. Der Kopierkonstruktor std::auto_ptr
akzeptiert auch eine nicht-konstante Referenz. Warum kompiliert es dann? Ich habe std::rand()
in foo1
verwendet, um RVO zu eliminieren (Rückgabewertoptimierung).Wie wird std :: auto_ptr mit einem rvalue initialisiert?
3
A
Antwort
2
Dies funktioniert anscheinend wegen eines kleinen Tricks, der verwendet wird, um den internen Zeiger auf das Konstruieren freizugeben std::auto_ptr
. Fall 4 von This Manual:
template< class Y >
auto_ptr(auto_ptr_ref<Y> m);
4) Konstruiert den auto_ptr mit dem gehaltenen Zeiger im auto_ptr Instanz, auf die sich m. p.release() wird für das auto_ptr p aufgerufen, das m hält, um das Eigentum des Objekts zu erhalten. auto_ptr_ref ist ein implementierungsdefinierter Typ, der einen Verweis auf auto_ptr enthält. std :: auto_ptr ist implizit in diesen Typ umwandelbar und zuweisbar. Die Implementierung darf die Vorlage mit einem anderen Namen versehen oder eine gleichwertige Funktionalität auf andere Weise implementieren.
(Hervorhebung hinzugefügt)
[FYI] 'std :: auto_ptr' veraltet. Es wurde durch 'std :: unique_ptr' und' std :: shared_ptr' ersetzt. – NathanOliver
Ich weiß aber immer noch alten Compiler zu verwenden. – Ashot
Sie können dann C++ 98 oder C++ 03 angeben. C++ selbst enthält den aktuellen Standard, der momentan C++ 14 ist. – NathanOliver