Resolución de sobrecarga en espacios de nombres
El siguiente código falla como se esperaba, porque no hay sobrecarga deget
es encontrado. Utilizandostd::get
resolvería el problema.
#include <array>
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//fails, get was not declared in this scope
}
Sin embargo, presentamos una versión con plantilla deget
, aunque no coincida con la llamada a la función, de alguna manera hace que el compilador use lastd::get
versión
#include <array>
template <typename T>
void get(){};
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//returns 2
}
No puedo encontrar ninguna parte del estándar que explique esto. ¿Es esto un error en los 3 compiladores que probé (probablemente no), o me falta algo?
ste comportamiento fue probado en
MSVC 15.9.2Clang 8.0.0GCC 9.0.0 (sigue siendo una versión experimental)EDIT: Soy consciente de ADL. Pero si ADL hace que el segundo código funcione, ¿por qué no lo hace en la primera parte?