160 votes

Quand doit-on utiliser std::move sur la valeur de retour d'une fonction ?

Dans ce cas

struct Foo {};
Foo meh() {
  return std::move(Foo());
}

Je suis presque sûr que le déplacement n'est pas nécessaire, parce que le nouveau créé Foo sera une valeur x.

Mais que faire dans des cas comme celui-ci ?

struct Foo {};
Foo meh() {
  Foo foo;
  //do something, but knowing that foo can safely be disposed of
  //but does the compiler necessarily know it?
  //we may have references/pointers to foo. how could the compiler know?
  return std::move(foo); //so here the move is needed, right?
}

C'est là que le déménagement est nécessaire, je suppose ?

-9voto

std::move n'est absolument pas nécessaire lors du retour d'une fonction, et relève vraiment du domaine où vous - le programmeur - essayez de garder des choses que vous devriez laisser au compilateur.

Que se passe-t-il lorsque vous std::move quelque chose hors d'une fonction qui n'est pas une variable locale à cette fonction ? Vous pouvez dire que vous n'écrirez jamais de code de ce genre, mais que se passe-t-il si vous écrivez du code qui est très bien, puis que vous le remaniez et que, par inadvertance, vous ne modifiez pas la fonction std::move . Vous allez vous amuser à traquer ce bug.

Le compilateur, quant à lui, est pratiquement incapable de faire ce genre d'erreurs.

De même : Il est important de noter que le retour d'une variable locale à partir d'une fonction ne no nécessairement créer une rvalue ou utiliser la sémantique move.

Voir ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X