Noções básicas sobre std :: function e std :: bind

Eu estava jogando com std :: function e std :: bind e notei algo não intuitivo e gostaria de entender melhor.

Por exemplo:

void fun()
{
}

void hun(std::string) 
{ 
}

int main()
{

   function<void(int)> g = &fun; //This fails as it should in my understanding.

   function<void(int)> f = std::bind(fun); //This works for reasons unknown to me     
   function<void(int, std::string)> h = std::bind(hun); //this doesn't work

return 0;
}

Como é possível ligar umfunction<void(int)> para uma função que évazio(). Eu poderia chamar f (1) e me divertir (). Eu gostaria de entender como isso é feito. Indo para dentro da implementação do Microsoft Visual Studio 2012 isso me deixou perdido em um mar de macros ilegíveis. então é por isso que faço esta pergunta aqui.

questionAnswers(2)

yourAnswerToTheQuestion