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?