Во время разрешения перегрузки определяется, что правильная функция для вызова при написании f(sr)
- void f(S<int>&);
без явной реализации определения шаблона класса S
, не определено, был ли фактически создан экземпляр вашего класса.
Неопределенное поведение и Неуказанное поведение - это две совершенно разные вещи.
создание экземпляра S разрешено, но не обязательно
Например:
template <class T =int>
struct S
{
operator int();
};
разрешено, но не обязательно.