Quando a movimentação explícita é necessária para uma instrução de retorno?
Em umcomente para outra pergunta Jonathan Wakely responde à minha declaração:
Você nunca precisa de um movimento explícito para um valor de retorno de função de variável local. Está implícito movimento lá
->
... nunca diga nunca ... Você precisa de um movimento explícito se a variável local não for do mesmo tipo que o tipo de retorno, por exemplo,std::unique_ptr<base> f() { auto p = std::make_unique<derived>(); p->foo(); return p; }
, mas se os tipos forem os mesmos, ele se moverá se possível ...
Então parece que às vezes podemostem que mova uma variável local ao retornar.
O exemplo
std::unique_ptr<base> f() {
auto p = std::make_unique<derived>();
p->foo();
return p;
}
é bom em que dá umaErro de compilação
> prog.cpp:10:14: error: cannot convert ‘p’ from type
> ‘std::unique_ptr<derived>’ to type ‘std::unique_ptr<derived>&&’
mas eu estou querendo saber se há uma boa chance de detectar isso em geral - eé isso aqui um limite das regras de linguagem ou deunique_ptr
??