2010-12-06 6 views
4

En N3126 (Attention: très grand PDF) 14.1/9, il y a deux déclarations qui me font confus:Pourquoi l'argument template-default d'une fonction mem devrait-il être explicitement défini comme illégal?

#1:"Un modèle argument par défaut peut être spécifié dans une déclaration de modèle."

#2:« Un modèle argument par défaut ne doit pas être spécifié dans les listes de paramètres-modèle de la définition d'un membre d'un modèle de classe qui apparaît en dehors de la classe du membre. »

#1 signifie le code suivant est légal:

template <class T = int> 
void f(T = T()) 
{} 

int main() 
{ 
    int n = f(); // equivalent to f<int>() or f(0); 
    return 0; 
} 

#2 signifie que le code suivant est illégal:

template <class T> 
struct X 
{ 
    template <class U = T> 
    void f(U a = U()) 
    {} 
}; 

int main() 
{ 
    X<int> x; 
    x.f(); // illegal, though I think it should be equivalent to x.f<int>() or x.f(0) 
    return 0; 
} 

Je me demande pourquoi ce dernier devrait être explicitement défini comme illégale par la norme ?

Quelle est la justification?

+0

Au lieu de « la page XXX » s'il vous plaît dire ce que l'article/paragraphe, il est. Les refres de page sont inutilisables car les différents documents de travail auront des pages très différentes et c'est un PITA pour faire défiler une page spécifique. –

Répondre

3

je pourrais me tromper, mais ma compréhension de #2 est qu'il rend l'exploitation illégale suivante:

template<class T> 
struct A 
{ 
    void foo(); 
}; 

template<class T = int> 
void A<T>::foo() { /* ... */ } 
+0

Merci beaucoup. L'anglais n'est pas ma langue maternelle. Je dois avouer que j'ai complètement mal lu les déclarations. – xmllmx

Questions connexes