Следующий код завершается неудачно, как и ожидалось, поскольку перегрузка get
не найдена. Использование std::get
решит проблему.
#include <array>
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//fails, get was not declared in this scope
}
Однако введение шаблонной версии get
, даже если она не соответствует вызову функции, каким-то образом заставляет компилятор использовать версию std::get
:
#include <array>
template <typename T>
void get(){};
int main()
{
std::array<int, 2> ar{2,3};
auto r = get<0>(ar);//returns 2
}
Я не могу найти какую-либо часть стандарта, которая объясняет это. Это ошибка во всех 3-х компиляторах, которые я тестировал (вероятно, нет), или я что-то упустил?
Это поведение было проверено в
- MSVC 15.9.2
- Лязг 8.0.0
- GCC 9.0.0 (все еще экспериментальная версия)
РЕДАКТИРОВАТЬ: я знаю о ADL. Но если ADL заставляет работать второй код, почему он не работает в первой части?