2010-08-07 5 views
7

Est-ce que C++ garantie standard, la suivante ?:C++ standard, la résolution de fonction surchargée/correspondant

template<typename T> 
void function(T (&)[1]); 

template<typename T> 
void function(T*); 

int a[1]; 
function(a); // first function gets called, not second version 
+0

Je voudrais savoir aussi. – zneak

+2

Bonne question, mais le sujet de la question n'est pas tellement. Pensez-vous que vous pourriez le rendre plus pertinent, comme "Est-ce que le type de paramètre T (&) [1] correspond mieux à T * pour un tableau dans les templates C++" par exemple. Btw, je ne suis pas sûr si cela a quelque chose à voir avec la surcharge. –

+0

@Mac J'ai légèrement changé de sujet, est-ce mieux? – Anycorn

Répondre

6

Oui, cela est garanti, mais la raison est différente de ce que dit GMan. La surcharge "array of length 1" sera sélectionnée car elle est plus spécialisée que la deuxième dans l'ordre partiel des fonctions du template. Fondamentalement, cela signifie qu'un argument sous la forme T(&)[1] correspondra toujours au deuxième argument de modèle sous la forme T*, de sorte que la première surcharge sera toujours sélectionnée lorsque les séquences de conversion ne décident pas.

De 13.3.3:

Compte tenu de ces définitions, une fonction viable F1 est définie comme étant une meilleure fonction qu'une autre fonction viable F2 si tous les arguments i, ICSI (F1) est pas un pire séquence de conversion de ICSI (F2), puis

  • pour certains j argument, ICSj (F1) est une meilleure séquence de conversion de ICSj (F2), ou, sinon que,

  • F1 est une fonction non-modèle et F2 est une spécialisation de la fonction modèle, ou, sinon que,

  • F1 et F2 sont des fonctions modèle, et le modèle de fonction pour F1 est plus spécialisé que la plaque tem- pour F2 selon les règles de commande partielles décrites dans 14.5.5.2, ou, sinon que,

...

Les fonctions normales sont uniquement affectées par le premier élément; Lorsque des fonctions de modèle sont dans l'ensemble des fonctions candidates, le deuxième ou le troisième élément peut décider. La raison pour laquelle nous le voulons est que nous voulons être capables d'écrire des surcharges modélisées apparemment ambiguës. Par exemple.

template <class T> void f(T); 
template <class T> void f(T*); 

serait par ailleurs ambiguë pour int*. En C++ 0x, vous pouvez même écrire des déclarations comme:

template <class ...Ts>   void f(const Ts&... args); 
template <class T, class ... Ts> void f(const T& a, const Ts&... args); 

et le second sera sélectionné chaque fois qu'il ya au moins un argument.

+0

De @aaa sur ma réponse supprimée: @jpa Donc, la présence de modèle est ce qui fait une grande différence? – GManNickG

+0

@GMan: Oui, voir modifier. – jpalecek

Questions connexes