C++ named requirements: RangeAdaptorObject (since 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. Массивы и функции преобразуются в указатели при связывании.