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