Resolução de sobrecarga olhando para namespaces

O código a seguir falha conforme o esperado, porque nenhuma sobrecarga deget seja encontrado. Usandostd::get resolveria o 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
}

No entanto, a introdução de uma versão do modelo doget, mesmo que não corresponda à chamada de função, de alguma forma faz o compilador usar ostd::get version:

#include <array>

template <typename T>
void get(){};

int main()
{
    std::array<int, 2> ar{2,3};

    auto r = get<0>(ar);//returns 2
}

Não consigo encontrar nenhuma parte do padrão que explique isso. Isso é um bug nos 3 compiladores que testei (provavelmente não), ou estou faltando alguma coisa?

Este comportamento foi testado em

MSVC 15.9.2Clang 8.0.0GCC 9.0.0 (ainda uma versão experimental)

EDIT: Estou ciente da ADL. Mas se o ADL faz o segundo código funcionar, por que não acontece na primeira parte?

questionAnswers(2)

yourAnswerToTheQuestion