Eu tenho um método que retorna um objeto por valor. O método vem de uma biblioteca que eu não tenho controle. Para o manuseio adicional do objeto, quero continuar trabalhando com um unique_ptr nesse objeto. Aqui está um exemplo:
#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());
}
O exemplo produz a seguinte saída:
Constructor!
Destructor!
Destructor!
Destructor!
Por que o destruidor de Bla é chamado 3 vezes aqui? A maneira como eu crio o unique_prt está correta?
std::move
não move nada. Apenas transmite de um tipo para outro.
std::move
on return
é um grande erro.