Как работает вывод аргумента шаблона, когда перегруженная функция используется в качестве аргумента?
Этоболее сложный вопрос упоминается вКак работает разрешение перегрузки, когда аргумент является перегруженной функцией?
Ниже кодкомпилируется без проблем:
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.
Может ли это быть объяснено правилами разрешения перегрузки / вывода аргументов шаблона или его следует квалифицировать как дефект в этих компиляторах?