анализируется соответственно.
ющий код завершается ошибкой, как и ожидалось, потому что нет перегрузки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.0GCC 9.0.0 (все еще экспериментальная версия)РЕДАКТИРОВАТЬ: я знаю о ADL. Но если ADL заставляет второй код работать, почему он не в первой части?