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?