Par exemple :
Big create()
{
Big x;
return std::move(x);
// return static_cast<typename std::remove_reference<T>::type&&>(t) // why not elide here?
}
En supposant que l'application std::move()
pour retourner une variable locale inhibe la sémantique du mouvement parce que les compilateurs ne peuvent pas faire d'hypothèses sur le fonctionnement interne des fonctions en général, mais qu'en est-il des cas où ces hypothèses ne sont pas nécessaires, par exemple lorsque :
-
std::move(x)
est inlined (probablement toujours) -
std::move(x)
s'écrit comme suit :static_cast<typename std::remove_reference<T>::type&&>(t)
Selon la norme actuelle, une implémentation est autorisée à appliquer le NRVO...
- dans une déclaration de retour dans une fonction avec un type de retour de classe, lorsque l'expression l'expression est le nom d'un objet automatique non volatile (autre que un paramètre de fonction ou une variable introduite par l déclaration d'exception d'un gestionnaire (18.3)) de même type (sans tenir compte de la qualification cv) que l'objet. (en ignorant la qualification cv) que le type de retour de la fonction, l'opération de copie/déplacement l'opération de copie/déplacement peut être omise en construisant l'objet automatique directement dans l'objet de retour de l'appel de fonction
De toute évidence, ni 1) ni 2) ne sont admissibles. Outre le fait que l'utilisation de std::move()
pour retourner une variable locale est redondant, pourquoi Cette restriction est-elle nécessaire ? ?