std::ranges::iter_move
Определено в заголовке <iterator> | ||
|---|---|---|
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ iter_move = /* unspecified */;
}
| (с C++20) (объект точки кастомизации) | |
| Подпись вызова | ||
template< class T >
requires /* see below */
constexpr decltype(auto) iter_move( T&& t ) noexcept(/* see below */);
| (с C++20) |
Получает ссылку на rvalue или временное значение prvalue из заданного итератора.
Выражение ranges::iter_move(t) является выражение-эквивалентным:
-
iter_move(t), еслиtимеет тип класса или перечисления, и выражение корректно при обработке как невычисленного операнда, где разрешение перегрузкиiter_moveвыполняется только с кандидатами, найденными с помощью поиска зависимых от аргументов. - Иначе,
std::move(*t)если*tкорректно и является lvalue. - Иначе,
*tесли*tкорректно и является rvalue.
Во всех остальных случаях вызов ranges::iter_move некорректен, что может привести к неудаче подстановки, когда ranges::iter_move(e) появляется в непосредственном контексте экземпляризации шаблона.
Если ranges::iter_move(e) не равно *e, программа некорректна, диагностика не требуется.
Объекты точки кастомизации
Имя ranges::iter_move обозначает объект точки кастомизации, который является const функциональным объектом типа литерала semiregular класса. Для наглядности, неквалифицированная версия его типа обозначается как __iter_move_fn.
Все экземпляры __iter_move_fn равны. Эффекты вызова различных экземпляров типа __iter_move_fn с одинаковыми аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и является ли он const-квалифицированным или нет (однако экземпляр с квалификатором volatile не обязан быть вызываемым). Таким образом, ranges::iter_move можно свободно копировать, и его копии можно использовать взаимозаменяемо.
При заданном наборе типов Args..., если std::declval<Args>()... удовлетворяет требованиям для аргументов ranges::iter_move выше, __iter_move_fn моделирует
-
std::invocable<__iter_move_fn, Args...>, -
std::invocable<const __iter_move_fn, Args...>, -
std::invocable<__iter_move_fn&, Args...>, и -
std::invocable<const __iter_move_fn&, Args...>.
В противном случае, ни один оператор вызова функции __iter_move_fn не участвует в разрешении перегрузки.
Пример
См. также
|
(C++20) | преобразует результат обращение к заданному итератору в ассоциированный тип ссылки на rvalue (функция) |
|
(C++20) | преобразует результат обращение к заданному итератору в ассоциированный тип ссылки на rvalue (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/ranges/iter_move