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