В разделе 8.3.6.4 стандарта С++ указано, что
Для функций без шаблона аргументы по умолчанию могут быть добавлены позже объявления функции в той же области. [...]
Но мой вопрос в том, почему для функций шаблона не допускается? В чем причина не допускать добавления аргументов по умолчанию в более поздние объявления в той же области для функций шаблона?
Рассмотрим эту программу, которая компилируется отлично. (функция без шаблона) (см. живую демонстрацию здесь.)
#include <iostream>
int f(int a,int b,int c=3);
int f(int a,int b=9,int c); // default argument in middle, ok allowed
int main()
{
f(3);
f(3,6);
f(3,6,9);
return 0;
}
int f(int a,int b,int c)
{
std::cout<<a<<' '<<b<<' '<<c<<'\n';
return 0;
}
Но после сбоя в компиляции. (функция шаблона) (см. живое демо здесь.)
#include <iostream>
template <typename T>
void f(T a,int b,int c=3);
template <typename T>
void f(T a,int b=9,int c); // compiler error why???
int main()
{
f(3);
f(3,6);
f(3,6,9);
return 0;
}
template <typename T>
void f(T a,int b,int c)
{
std::cout<<a<<' '<<b<<' '<<c<<'\n';
}