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?
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. –