В N3126 ( Предупреждение: очень большой PDF ) 14.1 / 9, есть два утверждения, которые меня смущают:
#1:
"В объявлении шаблона может быть указан аргумент шаблона по умолчанию."
#2:
"Параметр шаблона по умолчанию не должен указываться в списках параметров шаблона определения члена шаблона класса, который появляется вне класса члена."
#1
означает, что следующий код является допустимым:
template <class T = int>
void f(T = T())
{}
int main()
{
int n = f(); // equivalent to f<int>() or f(0);
return 0;
}
#2
означает, что следующий код недопустим:
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;
}
Мне просто интересно, почему последний должен быть явно определен как незаконный по стандарту?
Что является обоснованием?