Énoncé du problème
Visual Studio 2010 définit std::forward to désactiver la déduction des arguments du modèle. Pourquoi cette désactivation est-elle intentionnelle ?
Réponse
La déduction de l'argument du modèle entraînerait une détermination de type incorrecte et un comportement erroné dans std::forward. Voici comment :
Cas sans déduction d'argument de modèle
Sans déduction d'argument de modèle, std::forward est défini comme :
<code class="cpp">template<class _Ty> inline _Ty&& forward(typename identity<_Ty>::type& _Arg) { return ((_Ty&&)_Arg); }</code>
Cas avec déduction d'argument de modèle
Si std::forward utilisait la déduction d'argument de modèle, les scénarios suivants se présenteraient :
Implications d'une détermination de type incorrecte
Dans le transfert parfait, l'argument passé à std::forward est une lvalue. Si la déduction des arguments de modèle était activée, le type déduit T serait une référence lvalue. Cependant, "transfert parfait" implique une référence rvalue.
Le cast dans std::forward, static_cast
Exemple
Le code suivant illustre les problèmes liés à la déduction des arguments de modèle :
<code class="cpp">template<typename T> T&& forward_with_deduction(T&& obj) { return static_cast<T&&>(obj); } int main() { int x; int& y = x; int&& z = std::move(x); forward_with_deduction(7); // Correctly calls forward(int&&) forward_with_deduction(y); // Incorrectly calls forward(int&) std::forward<int&>(y); // Correctly calls forward(int&) }</code>
Conclusion
La désactivation de la déduction des arguments de modèle dans std::forward est cruciale pour que le transfert parfait fonctionne correctement. Il empêche une détermination de type erronée et garantit que les références rvalue sont correctement transmises en tant que références rvalue.
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!