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.