Я пытаюсь закодировать функцию шаблона, которая использует разрешенный ADL get для извлечения элементов структуры/диапазона (tuple -esque).
#include <iostream>
#include <utility>
#include <tuple>
int main() {
auto tup = std::make_tuple(1, 2);
std::cout << get<0>(tup) << std::endl;
}
Я делаю это из-за того, что предложение структурированных привязок (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf §11.5.3) говорит о том, как используется get для извлечения элементов из структуры. В нем говорится, что для элемента изнутри структуры используется элемент non member get.
Я предположил, что код выше будет компилироваться, поскольку ADL приведет к тому, что функция get будет искать в пространстве имен std (поскольку аргумент имеет тип std::tuple<int, int>, который находится в std), где он будет найден. Но я получаю сообщение об ошибке. Может ли кто-то объяснить правильный подход здесь, а также почему код выше не работает? Как можно заставить ADL произойти в этом случае?