Почему следующее не дает ошибки компиляции ?:
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
Кажется, что 13 просто игнорируется компилятором. Почему это?
Дело в том, что если определение шаблона класса находится в Main.cpp вместо заголовочного файла, я действительно получаю переопределение параметров по умолчанию error.
Теперь я знаю, что компилятор будет жаловаться на это, если это будет просто обычная (не шаблонная) функция.
Что стандарт должен сказать о параметрах по умолчанию в функциях-членах шаблонов классов или шаблонах функций?