Ich habe eine Methode, die ein Objekt nach Wert zurückgibt. Die Methode stammt aus einer Bibliothek, über die ich keine Kontrolle habe. Für die weitere Bearbeitung des Objekts möchte ich weiterhin mit einem unique_ptr an diesem Objekt arbeiten. Hier ist ein Beispiel:
#include <iostream>
#include <memory>
class Bla {
public:
Bla() { std::cout << "Constructor!\n"; }
~Bla() { std::cout << "Destructor!\n"; }
};
Bla GetBla() {
Bla bla;
return std::move(bla);
}
int main() {
auto bla = std::make_unique<Bla>(GetBla());
}
Das Beispiel erzeugt die folgende Ausgabe:
Constructor!
Destructor!
Destructor!
Destructor!
Warum wird der Zerstörer von Bla hier dreimal gerufen? Ist die Art und Weise, wie ich den unique_prt erstelle, korrekt?
std::move
bewegt nichts. Es wird nur von einem Typ zum anderen geworfen.
std::move
on return
ist ein großer Fehler.