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
Susan Sarandonoriginal
2024-11-28 03:22:11780parcourir

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);
}

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 };

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);
}

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);
}

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!

Déclaration:
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