Причина в том, что вы не получаете неявные преобразования типов во время вывода шаблона, он никогда не достигает этой точки.
Рассмотрим:
template <typename T>
struct foo {};
template <typename U>
void bar(foo<U>)
{}
foo<int> f;
bar(f);
Для этого вызова bar компилятор может определить, что U
является int
, и создать экземпляр функции. Однако рассмотрим:
template <typename U>
void bar(foo<const U>)
{} // note ^^^^
foo<int> f;
bar(f);
Нет U
, который компилятор может вывести так, чтобы тип foo
соответствовал типу параметра. Следовательно, создание шаблона не удалось. Нет никаких шансов для преобразования.