Retour de std :: move (f) dans std :: for_each

J’écris une implémentation de la bibliothèque standard c ++ pour étude.

La norme C ++ 11 dit que for_each renvoie std::move(f) .

 template  Function for_each(InputIterator first, InputIterator last, Function f); Returns: std::move(f). 

Je pensais que la variable locale de scope de la fonction est construite par déplacement lorsqu’elle est renvoyée. Dois-je retourner move(f) explicitement?

De la bibliothèque standard de C ++ de Josuttis

Vous n’avez pas à et ne devriez pas move () renvoyer des valeurs. Selon les règles de langage, la norme spécifie que pour le code suivant

 X foo () { X x; ... return x; } 

le comportement suivant est garanti:

• Si X a un constructeur de copie ou de déplacement accessible, le compilateur peut choisir d’éluder la copie. Il s’agit de la soi-disant optimisation de la valeur de retour (nommée) ((N) RVO) , spécifiée même avant C ++ 11 et supscope par la plupart des compilateurs.

• Sinon, si X a un constructeur de déplacement, x est déplacé.

• Sinon, si X a un constructeur de copie, x est copié.

• Sinon, une erreur de compilation est émise.

À partir de §25.2.4 (for_each)

Requiert: la fonction doit satisfaire aux exigences de MoveConstructible (Tableau 20) . [Remarque: la fonction ne doit pas nécessairement répondre aux exigences de CopyConstructible (Tableau 21) .— note finale]

Avec std::move(f) vous pouvez être assuré de pouvoir lire l’état muté à l’extérieur.