¿Cómo funciona la deducción de argumentos de plantilla cuando una función sobrecargada está involucrada como argumento?

Este es elpregunta más sofisticada mencionado en¿Cómo funciona la resolución de sobrecarga cuando un argumento es una función sobrecargada?

Debajo del códigocompila sin ningún problema:

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);
}

No parece una tarea difícil para la deducción de argumentos de plantilla: solo hay una funciónfoo() eso acepta dos argumentos. Sin embargo, sin comentar la sobrecarga de plantilla defoo() (que todavía tiene un solo parámetro) interrumpe la compilación sin ninguna razón obvia. La compilación falla tanto con gcc 5.x / 6.xy clang 3.9.

¿Puede explicarse por las reglas de resolución de sobrecarga / deducción de argumentos de plantilla o debería calificarse como un defecto en esos compiladores?

Respuestas a la pregunta(1)

Su respuesta a la pregunta