std::forward : transfert parfait pour les références Lvalue et Rvalue
Comprendre std::forward
std::forward est une fonction utilitaire C 11 qui permet un transfert parfait, garantissant que les références rvalue sont préservées en tant que références rvalue et que les références lvalue sont préservées en tant que références lvalue. Ceci est particulièrement utile dans la programmation de modèles où il est crucial de conserver la nature originale de l'argument passé.
Mécanisme de std::forward
L'idée fausse selon laquelle std : :forward est essentiellement static_cast
Transfert parfait
Dans le contexte de la programmation de modèles, std::forward devient crucial lorsque vous disposez d'une fonction de modèle qui accepte un générique tapez et transférez-le vers une autre fonction. L'objectif est de garantir que l'argument transmis est traité de la même manière que l'argument d'origine.
Prenons l'exemple d'une fonction modèle perfectSet qui transmet un argument t de type T&& à un ensemble de fonctions. Selon la manière dont perfectSet est appelé, t peut être soit une référence lvalue, soit une référence rvalue. Le comportement souhaité est que set traite t en conséquence.
Sans std::forward, le compilateur devrait supposer que t est passé par référence lvalue, ce qui pourrait conduire à une copie des données. Cependant, en utilisant std::forward, nous demandons au compilateur de conserver la nature originale de t:
template<class T> void perfectSet(T&& t) { set(std::forward<T>(t)); }
Si t est une référence lvalue, std::forward renverra une référence lvalue et set le fera. exécuter sa surcharge de référence lvalue, conduisant à la copie des données. Mais si t est une référence rvalue, std::forward renverra une référence rvalue et set exécutera sa surcharge de référence rvalue, entraînant une opération de déplacement.
Résoudre la confusion Lvalue/Rvalue
La différence apparente dans le comportement de std::forward lors du passage de thing&& vs thing& peut sembler déroutante à première vue. Cependant, cela vient du fait que les références lvalue et les références rvalue sont des entités distinctes en C .
Pour conserver la nature originale, la fonction modèle et la fonction réceptrice doivent utiliser rvalue références lors de l’acceptation d’une rvalue. C'est précisément ce qu'assure std::forward, assurant un transfert parfait et des performances optimales.
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!