Здравствуйте, collider, Вы писали:
C>ведь угадывает же компилятор
Компилятор не угадывает, а выбирает наилучшую сигнатуру, выполняя строго ограниченный набор преобразований.
Глубина прозрения компилятора — ровно в один шаг. А здесь два шага: подобрать параметр шаблона и выполнить приведение типа конструктором.
Причём вывод параметра шаблона из зависимости — вообще никогда не делается.
Пример, почему авторы стандарта не стали морочить головы разработчикам компиляторов
template<class T> struct foo {
foo(T) {}
};
template<> struct foo<char> {
foo(int) {}
};
template<class T> struct foo<T*> {
foo(T) {}
};
template<class T> void bar(foo<T> t) {}
int main() {
bar(123); // foo<int>, foo<char>, foo<int*> ?
}
Это тебе не ML и Haskell, где система типов позволяет решать уравнения на любую глубину в любую сторону.