Maison > développement back-end > C++ > Comment `std::move()` convertit-il les expressions en rvalues ​​en C ?

Comment `std::move()` convertit-il les expressions en rvalues ​​en C ?

Susan Sarandon
Libérer: 2024-11-28 03:22:11
original
778 Les gens l'ont consulté

How does `std::move()` convert expressions to rvalues in C  ?

std::move() et la conversion des expressions en Rvalues

std::move() est une fonction puissante en C qui vous permet de déplacer des objets d'un emplacement à un autre sans les copier. Comprendre son implémentation peut être difficile, mais il est essentiel de connaître ses capacités.

Détails de l'implémentation

L'implémentation de std::move() dans la bibliothèque standard MSVC utilise le modèle std::remove_reference pour convertir les expressions en rvalues. Voici comment cela fonctionne :

template<class _Ty> inline
typename tr1::_Remove_reference< _Ty >:: _Type& &&
move( _Ty && _Arg ) {
  return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg);
}
Copier après la connexion

Liaison aux Lvalues

Lorsque vous transmettez une lvalue à std::move(), le paramètre de référence _Arg se lie à la lvalue . Cependant, vous ne pouvez pas lier directement une référence rvalue à une lvalue. Pour résoudre ce problème, l'implémentation convertit la lvalue en une référence rvalue à l'aide de std::static_cast.

Comprendre std::remove_reference

std::remove_reference est utilisé pour supprimer références à partir de types. Voici son implémentation :

template<class _Ty>
struct _Remove_reference {
  typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference< _Ty && > {
  typedef _Ty _Type;
};
template<class _Ty>
struct _Remove_reference< _Ty &&&&> {
  typedef _Ty _Type };
Copier après la connexion

Utilisation avec Rvalues

Lorsque std::move() est appelé avec une rvalue, std::remove_reference convertit T&& en T, résultant en l'instanciation de modèle de fonction suivante :

Object&& move(Object&& arg) {
  return static_cast<Object&&>(arg);
}
Copier après la connexion

Le cast est requis car les références rvalue nommées sont traité comme des lvalues.

Utilisation avec Lvalues

Lorsque std::move() est appelé avec une lvalue, std::remove_reference convertit T& en T, ce qui entraîne le Instanciation de modèle de fonction suivante :

Object&& move(Object& && arg) {
  return static_cast<Object&&>(arg);
}
Copier après la connexion

Les règles de réduction de référence fournies par la norme C 11 autorisent Object& && pour se lier aux lvalues. La fonction résultante convertit efficacement l'argument lvalue en une référence rvalue.

Conclusion

std::move() exploite std::remove_reference et les règles de réduction de référence pour permettre au conversion des lvalues ​​et des rvalues ​​en références rvalue. Cela permet un déplacement efficace des objets et une optimisation de l'utilisation de la mémoire.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal