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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta