2016-06-17 27 views
3

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?

+4

[FYI] 'std :: auto_ptr' veraltet. Es wurde durch 'std :: unique_ptr' und' std :: shared_ptr' ersetzt. – NathanOliver

+0

Ich weiß aber immer noch alten Compiler zu verwenden. – Ashot

+1

Sie können dann C++ 98 oder C++ 03 angeben. C++ selbst enthält den aktuellen Standard, der momentan C++ 14 ist. – NathanOliver

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)