L'ordre partiel des gabarits de fonction contenant des packs de paramètres de gabarit est indépendant du nombre d'arguments déduits pour ces gabarits de paramètres de gabarit.Ordonnancement partiel de modèles de fonctions contenant des packs de paramètres de gabarit
template<class...> struct Tuple { };
template< class... Types> void g(Tuple<Types ...>); // #1
template<class T1, class... Types> void g(Tuple<T1, Types ...>); // #2
template<class T1, class... Types> void g(Tuple<T1, Types& ...>); // #3
g(Tuple<>()); // calls #1
g(Tuple<int, float>()); // calls #2
g(Tuple<int, float&>()); // calls #3
g(Tuple<int>()); // calls #3
ci-dessus est cité de partial ordering of overload function templates. Je ne comprends pas pourquoi g(Tuple<int>()); // calls #3
. Plus précisément, pourquoi ne peut-on appeler #2
? Ce qui suit est mon raisonnement, s'il vous plaît signaler les erreurs:
Remarque: Je ne tiendrai pas compte #1
b/c il est bien expliqué here
Étape 1: Déduction et résolution de substitution et de surcharge viennent avec ceux-ci:
- void (tuple < int>) [T1 = int, types est vide] # 2
- void (tuple < int>) [T1 = Int est vide & Types] # 3
2 Etape : Transform deux modèles de fonction:
- annuler g (tuple < C1 ... Pack1>);
- void g (Tuple < C2, paquet2 & ...>);
Etape 3: Ceci est un contexte d'appel de fonction, les types sont les types de paramètres de fonction pour laquelle l'appel de fonction a des arguments:
- Déduire Tuple < T1, Types ...> de Tuple < C2, paquet & ...> OK [T1 = C2; Types ... = Paquet & ...]
- Déduit Tuple < T1, Types & ...> à partir de Tuple < C1, Pack1 ...>) OK? [T1 = C1; Qu'en est-il des types & ...? Peut-il être déduit de Pack1 ...? Est-référence a chuté ici?]
3) Si P est un type de référence, le type visé par P est utilisé pour la déduction. This semble bien. Si P a l'une des formes qui incluent une liste de paramètres de modèle < T> ou < I>, alors chaque élément Pi de cette liste d'arguments modèle est comparé à l'argument de modèle correspondant Ai de son A. Si le dernier Pi est un développement de pack, puis son modèle est comparé à chaque argument restant dans la liste d'arguments de modèle de A. Un pack de paramètres de fin qui n'est pas déduit autrement, est déduit à un pack de paramètres vide.
Step4: Si la dernière étape est correcte. Cela signifie que # 3 n'est pas plus spécialisé que # 2.Il est donc ambigu quant à quel modèle de fonction doit être résolu.
Mise à jour: Je crois avoir mal compris les citations pertinentes ci-dessus. Lorsque nous associons les paramètres de modèle dans P avec les arguments de modèle dans A, ils sont mis en correspondance verbatim, ce qui signifie que toutes les transformations et analyses effectuées sur fonction appel paramètres et arguments ne s'appliquent pas à nouveau lorsque nous faisons correspondre les paramètres/arguments de modèle P/A (actuellement appel de fonction paramètre/arguments). Alors il échouera en l'étape 3 ci-dessus pour déduire Tuple< T1, Types&...>
de Tuple< C1, Pack1...>)
. Donc, #3
est plus spécialisé.
Avez-vous essayé avec les dernières versions de divers compilateurs? – Walter
J'ai essayé sur g ++ seulement. Où puis-je essayer d'autres compilateurs en ligne? – Rich
jeter un oeil à http://melpon.org/wandbox/ –