C ++ 11 auto, std :: function y llamada ambigua a función sobrecargada

Me pregunto si alguien sabe por qué el siguiente ejemplo no se compila dando una llamada ambigua a un error de función de sobrecarga. Si reemplazo el auto con una firma de functor fuertemente tipada, entonces es capaz de distinguir adecuadamente entre las dos sobrecargas del método.

Noté que el mismo problema no ocurre cuando no uso std :: function como mis argumentos de sobrecarga. Si mis sobrecargas toman solo un float simple e int, el compilador puede distinguir adecuadamente entre las dos sobrecargas incluso cuando usa la palabra clave auto para definir mis argumentos de entrada. Estoy compilando esto en VisualStudio 2012. ¿Podría ser esto solo un error en el compilador de VS? No tengo acceso a una máquina con GCC o Clang en este momento, pero ¿alguien sabe si esto se compilaría allí?

Error de compilación: llamada ambigua a la función de sobrecarga

class AmbiguousOverload
{
public:
    static void OverloadedMethod(std::function<int()>) {}
    static void OverloadedMethod(std::function<float()>) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    auto func1 = []() -> float {
        return 0.5f;
    };

    auto func2 = []() -> int {
        return 12;
    };

    AmbiguousOverload::OverloadedMethod(func1);
    AmbiguousOverload::OverloadedMethod(func2);

    return 0;
}

Compila

class AmbiguousOverload
{
public:
    static void OverloadedMethod(std::function<int()>) {}
    static void OverloadedMethod(std::function<float()>) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::function<float()> func1 = []() -> float {
        return 0.5f;
    };

    std::function<int()> func2 = []() -> int {
        return 12;
    };

    AmbiguousOverload::OverloadedMethod(func1);
    AmbiguousOverload::OverloadedMethod(func2);

    return 0;
}

También compila

class AmbiguousOverload
{
public:
    static void OverloadedMethod(int) {}
    static void OverloadedMethod(float) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    auto v1 = 0.5f;
    auto v2 = 12;

    AmbiguousOverload::OverloadedMethod(v1);
    AmbiguousOverload::OverloadedMethod(v2);

    return 0;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta