Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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, где система типов позволяет решать уравнения на любую глубину в любую сторону.
Я и не говорю, что компилятор прям должен... Я хотел узнать, если ли какой финт ушами.
Пример ваш не корректен,конечно foo<int>.