Désactivation de la déduction d'argument de modèle dans std::forward
Question :
Pourquoi le modèle déduction d'argument désactivée dans l'implémentation de std::forward dans Visual Studio 2010 ?
Réponse :
std::forward est une fonction utilitaire utilisée pour un transfert parfait, où le type de l'argument d'entrée est conservé dans l'argument de sortie. Cependant, si la déduction des arguments de modèle était activée dans std::forward, cela pourrait conduire à un comportement incorrect dans certains scénarios.
Plus précisément, si l'argument d'entrée est une lvalue ou une const lvalue (c'est-à-dire un objet avec un nom ), la déduction de l'argument du modèle déduirait que le type de paramètre est une référence lvalue ou const lvalue. Dans le scénario de transfert parfait, ce n'est pas ce qui est souhaité, car l'objectif est de conserver le type exact de l'argument d'entrée.
Pour illustrer le problème potentiel :
<code class="cpp">template<typename T> void test(T&& obj) { // ... } int main() { int x; int& y = x; test(7); // input is an rvalue, so T is deduced as int&& test(x); // input is an lvalue, so T is deduced as int& test(y); // input is a named lvalue, so T is deduced as int& }</code>
Dans ce cas Par exemple, si std::forward utilisait la déduction d'argument de modèle, le type de l'argument dans test(x) et test(y) serait déduit incorrectement comme int&, conduisant à un comportement inattendu.
Pour éviter ce problème, l'implémentation de std::forward utilise la métafonction d'identité pour spécifier explicitement le paramètre de type, désactivant ainsi la déduction des arguments du modèle. Cela garantit que le type de l'argument d'entrée est conservé dans l'argument de sortie, qu'il s'agisse d'une rvalue ou d'une lvalue.
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!