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??

questionAnswers(1)

yourAnswerToTheQuestion