Я считаю, что, поскольку вызов get квалифицирован, компилятор не может найти мои get
функции. Правильно ли этот вывод?
Да.
Если да, то это предполагаемое поведение?
Это указано поведение минимум. [range.elements.view] определяет понятие как:
template<class T, size_t N>
concept has-tuple-element = // exposition only
requires(T t) {
typename tuple_size<T>::type;
requires N < tuple_size_v<T>;
typename tuple_element_t<N, T>;
{ get<N>(t) } -> convertible_to<const tuple_element_t<N, T>&>;
};
где все вызовы функций в стандартной библиотеке неявно полностью квалифицируются, если не указано иное [library.contents] / 3 :
Каждый раз, когда упоминается имя x
, определенное в стандартной библиотеке, предполагается, что имя x
полностью определено как ::std::x
, если явно не указано иное.
Здесь нет другого описания.
Однако, предназначено это или нет - другой вопрос. И ответ тоже есть. Да, в Библиотеке нет концепции TupleLike. Да, структурированные привязки существуют, но формальной спецификации этого в Библиотеке пока нет - так что пока это не произойдет, все алгоритмы, подобные кортежу, работают только для вещей, подобных кортежу стандартной библиотеки (pair
, array
, tuple
, et c.)
Определено ли поведение для определения моих функций get в пространстве имен std?
Нет, нельзя.