Как работает вывод аргумента шаблона, когда перегруженная функция используется в качестве аргумента?

Этоболее сложный вопрос упоминается вКак работает разрешение перегрузки, когда аргумент является перегруженной функцией?

Ниже кодкомпилируется без проблем:

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.

Может ли это быть объяснено правилами разрешения перегрузки / вывода аргументов шаблона или его следует квалифицировать как дефект в этих компиляторах?

Ответы на вопрос(1)

Ваш ответ на вопрос