Рассмотрим простой пример:
template <class T>
struct foo {
template <template <class> class TT>
foo(TT<T>&&) {}
foo(foo<T>&&){}
foo() {}
};
int main() {
foo f1(foo<int>{}); //case 1.
foo<int> f2(foo<int>{}); //case 2.
}
Случай 1. вызывает неоднозначность в аргументе шаблона дедукции класса foo в clang, но не в gcc. Я думал, что функции шаблона (здесь - конструктор) имеют более низкий приоритет при разрешении перегрузки. Это не так?
Сообщение об ошибке:
prog.cc:10:14: error: ambiguous deduction for template arguments of 'foo'
foo f1(foo<int>{}); //case 1.
^
prog.cc:4:5: note: candidate function [with T = int, TT = foo]
foo(TT<T>&&) {}
^
prog.cc:5:5: note: candidate function [with T = int]
foo(foo<T>&&){}
^
1 error generated.