O argumento do modelo (a assinatura) do std :: function não faz parte do seu tip

Dado o código a seguir, qual é o motivo por trás da ambiguidade? Posso contorná-lo ou terei que manter os lançamentos explícitos (irritantes)?

#include <functional>

using namespace std;

int a(const function<int ()>& f)
{
    return f();
}

int a(const function<int (int)>& f)
{
    return f(0);
}

int x() { return 22; }

int y(int) { return 44; }

int main()
{
    a(x);  // Call is ambiguous.
    a(y);  // Call is ambiguous.

    a((function<int ()>)x);    // Works.
    a((function<int (int)>)y); // Works.

    return 0;
}

Curiosamente, se eu comentar oa() função com ofunction<int ()> parâmetro e chamea(x) no meu principal, a compilação falha corretamente devido à incompatibilidade de tipo entrex e o argumentofunction<int (int)> do únicoa() função disponível. Se o compilador falhar nesse caso, por que haveria ambiguidade quando os doisa()unções estão presente

Eu tentei com o VS2010 e o g ++ v. 4.5. Ambos me dão exatamente a mesma ambiguidad

questionAnswers(4)

yourAnswerToTheQuestion