Maison >développement back-end >C++ >L'affectation automatique dans les fonctions de la bibliothèque standard C 11 a-t-elle des garanties ?
Assignation d'auto-déplacement dans la bibliothèque standard C 11
La norme C 11 englobe diverses dispositions concernant l'affectation d'auto-déplacement, notamment en conjonction avec la norme bibliothèque. Cet article explique ces dispositions, en se concentrant sur les implications de l'affectation automatique des mouvements dans les fonctions de bibliothèque.
Plus précisément, la norme garantit que lorsqu'un argument dans une fonction de bibliothèque standard est un paramètre de référence rvalue, l'implémentation peut en assumer l'exclusivité. . Cela signifie que l'implémentation peut optimiser le code en sachant que l'objet passé n'est pas modifié par la fonction.
Dans le contexte de l'affectation automatique des déplacements, cette garantie a un impact notable. Par exemple, considérons la fonction suivante :
template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; }
Lorsqu'une lvalue est transmise, le constructeur de copie du vecteur est invoqué, créant une copie du vecteur d'entrée. Cependant, en raison de la garantie standard de la bibliothèque, l'implémentation de l'opérateur d'affectation de déplacement du vecteur peut supposer que son argument est une prvalue. Ainsi, l'auto-affectation n'est pas réalisable et le comportement de la fonction devient dépendant de l'implémentation.
Dans la plupart des cas, l'auto-affectation laisse le vecteur d'origine dans un état sans ressources (capacité 0) . Si le vecteur possède déjà une capacité nulle, l'opération devient une opération sans opération. Cependant, il est crucial de noter que les états des vecteurs d'origine et déplacés ne sont pas spécifiés après l'auto-affectation.
Les mises à jour récentes de la norme dans le projet de travail N4618 clarifient davantage ces dispositions, spécifiant que dans le MoveAssignable exigences, où une valeur r (rv) est affectée à une expression (t), t n'a besoin d'atteindre la valeur de rv avant l'affectation que si t et rv ne font pas référence au même objet. Indépendamment de cette condition, l'état de rv reste non spécifié après l'affectation.
De plus, une note souligne que rv doit respecter les exigences du composant de bibliothèque qui l'utilise, que t et rv fassent ou non référence au même objet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!