Q :
Lors de l'utilisation de C 11 avec g 4.7, une tentative de compilation de code à l'aide de la fonction std::make_pair avec des paramètres de modèle explicitement spécifiés échoue. L'objectif est de comprendre la cause de cette erreur.
A :
Utilisation incorrecte pour make_pair
std::make_pair est destiné à la déduction automatique des arguments de modèle. La spécification explicite des paramètres du modèle empêche cette déduction, conduisant à une inadéquation entre les types d'arguments réels et attendus. La fonction prend des arguments de type T&& et U&&, où T et U sont des paramètres de type de modèle, ressemblant effectivement à :
template<typename T, typename U> make_pair(T&& argT, U&& argU);
Différence de type d'argument
Lors de la spécification des paramètres de modèle explicitement, aucune déduction d’argument n’a lieu. Au lieu de cela, les types spécifiés sont utilisés directement dans le modèle de fonction, ce qui donne :
make_pair(std::string&& argT, int&& argU);
Dans ce cas, les deux types de paramètres sont des références rvalue, qui ne peuvent se lier qu'à des rvalues. Cependant, l'un des arguments, s, est une lvalue (un objet existant), ce qui le rend incompatible avec le type de référence rvalue attendu. Ainsi, le modèle de fonction ne peut pas correspondre aux arguments fournis, ce qui entraîne une erreur de compilation.
Utilisation correcte de make_pair
Pour résoudre ce problème, supprimez la spécification explicite du paramètre de modèle. et permettre la déduction automatique des arguments. Dans ce scénario, le compilateur peut déduire que T est std::string, car s est une lvalue de type std::string, ce qui donne std::string& comme type d'argument final. De même, U est déduit être int, l'argument 7 étant une rvalue de type int, ce qui donne int&&. Ces types d'arguments correspondent correctement au modèle de fonction, permettant une compilation réussie.
Directive générale pour les modèles
Pour les modèles, il est généralement conseillé de laisser le compilateur effectuer la déduction des arguments du modèle chaque fois que possible. La spécification explicite des paramètres du modèle ne doit être effectuée qu'en cas d'absolue nécessité.
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!