Maison > développement back-end > C++ > Pourquoi la spécification explicite des paramètres de modèle dans `std::make_pair` de C 11 échoue-t-elle à se compiler ?

Pourquoi la spécification explicite des paramètres de modèle dans `std::make_pair` de C 11 échoue-t-elle à se compiler ?

Mary-Kate Olsen
Libérer: 2025-01-01 12:49:11
original
988 Les gens l'ont consulté

Why Does Explicitly Specifying Template Parameters in C  11's `std::make_pair` Fail to Compile?

C 11 make_pair avec les paramètres de modèle spécifiés ne parvient pas à se compiler

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);
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal