C++ именованные требования: RangeAdaptorObject (с C++20)
Объекты адаптеров диапазонов — это объекты точек кастомизации, которые принимают viewable_range в качестве своего первого аргумента и возвращают view. Некоторые объекты адаптеров диапазонов являются унарными, то есть они принимают один viewable_range в качестве единственного аргумента. Другие объекты адаптеров диапазонов принимают viewable_range и другие последующие аргументы.
Если объект адаптера диапазона принимает только один аргумент, то он также является RangeAdaptorClosureObject.
Если объект адаптера диапазона принимает более одного аргумента, он также поддерживает частичное применение: пусть
-
a— такой объект адаптера диапазона, и -
args...— аргументы (обычно подходящие для последующих аргументов),
выражение a(args...) обладает следующими свойствами:
- оно является допустимым тогда и только тогда, когда для каждого аргумента
eвargs..., таком чтоE— этоdecltype((e)),std::is_constructible_v<std::decay_t<E>, E>— этоtrue, - когда вызов допустим, его результирующий объект хранит подобъект типа
std::decay_t<E>, прямой не-список-инициализированный со значениемstd::forward<E>(e), для каждого аргументаeвargs...(другими словами, объекты адаптеров диапазонов связывают аргументы по значению), - результирующий объект является RangeAdaptorClosureObject,
- вызов RangeAdaptorClosureObject передаёт связанные аргументы (если таковые имеются) ассоциированному объекту адаптера диапазона. Связанные аргументы (если таковые имеются) считаются имеющими категорию значения и cv-квалификацию RangeAdaptorClosureObject. Другими словами,
a(args...)(r)эквивалентноstd::bind_back(a, args...)(r)(но первый также поддерживает синтаксис канала).(с C++23)
Как и другие объекты точек кастомизации, пусть
-
a— объект от cv-неквалифицированной версии типа любого объекта адаптера диапазона, -
args...— любая группа аргументов, которая удовлетворяет ограничениямoperator()типаa,
вызовы
-
a(args...), -
std::as_const(a)(args...), -
std::move(a)(args...), и -
std::move(std::as_const(a))(args...)
все эквивалентны.
Результирующий объект каждого из этих выражений — это либо объект view, либо RangeAdaptorClosureObject.
Примечания
operator() не поддерживается для volatile-квалифицированных или const-volatile-квалифицированных версий типов объектов адаптера диапазона. Массивы и функции преобразуются в указатели при связывании.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/RangeAdaptorObject