Это более сложный вопрос, упомянутый в Как работает разрешение перегрузки, когда аргумент является перегруженной функцией?
Ниже код компилируется без каких-либо проблем:
void foo() {}
void foo(int) {}
void foo(double) {}
void foo(int, double) {}
// Uncommenting below line break compilation
//template<class T> void foo(T) {}
template<class X, class Y> void bar(void (*f)(X, Y))
{
f(X(), Y());
}
int main()
{
bar(foo);
}
Это не сложная задача для вывода аргумента шаблона - существует только одна функция foo()
, которая принимает два аргумента. Однако раскомментирование перегрузки шаблона foo()
(которая по-прежнему имеет только один параметр) прерывает компиляцию по очевидной причине. Компиляция не работает как с gcc 5.x/6.x, так и с clang 3.9.
Можно ли это объяснить правилами разрешения перегрузки/вывода аргумента шаблона или он должен быть квалифицирован как дефект в этих компиляторах?