Wie funktioniert die Ableitung von Vorlagenargumenten, wenn eine überladene Funktion als Argument beteiligt ist?

Dies ist das anspruchsvollere Frage erwähnt inWie funktioniert die Überladungsauflösung, wenn ein Argument eine überladene Funktion ist?

Below codekompiliert ohne Probleme:

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

Es scheint keine herausfordernde Aufgabe für die Ableitung von Vorlagenargumenten zu sein - es gibt nur eine Funktionfoo() das akzeptiert zwei Argumente. Die Template-Überladung von @ wird jedoch nicht kommentierfoo() (das immer noch nur einen einzigen Parameter enthält) bricht die Kompilierung ohne ersichtlichen Grund ab. Die Kompilierung schlägt sowohl mit gcc 5.x / 6.x als auch mit clang 3.9 fehl.

Kann es durch die Regeln für die Überladungsauflösung / den Abzug von Vorlagenargumenten erklärt werden oder sollte es als Fehler in diesen Compilern eingestuft werden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage