анализируется соответственно.

ющий код завершается ошибкой, как и ожидалось, потому что нет перегрузки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 заставляет второй код работать, почему он не в первой части?

Ответы на вопрос(2)

Ваш ответ на вопрос