Como a dedução de argumento de modelo funciona quando uma função sobrecarregada está envolvida como argumento?

Isto é opergunta mais sofisticada mencionado emComo a resolução de sobrecarga funciona quando um argumento é uma função sobrecarregada?

Código abaixocompila sem nenhum 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);
}

Não parece uma tarefa desafiadora para dedução de argumento de modelo - há apenas uma funçãofoo() que aceita dois argumentos. No entanto, descomentando a sobrecarga de modelo defoo() (que ainda possui apenas um único parâmetro) interrompe a compilação sem motivo óbvio. A compilação falha com o gcc 5.x / 6.xe clang 3.9.

Pode ser explicado pelas regras de resolução de sobrecarga / dedução de argumento de modelo ou deve ser qualificado como um defeito nesses compiladores?

questionAnswers(1)

yourAnswerToTheQuestion