C++ named requirements:
RangeAdaptorClosureObject (since C++20)
Range adaptor closure objects are FunctionObjects that are callable via the pipe operator:
if C
is a range adaptor closure object and R
is a range, these two expressions are equivalent:
C(R)
R | C
Two range adaptor closure objects can be chained by operator|
to produce another range adaptor closure object:
if C
and D
are range adaptor closure objects, then C | D
produces a range adaptor closure object E
with the following properties:
E
stores a copy ofC
andD
, direct-non-list-initialized fromstd::forward<decltype((C))>(C)
andstd::forward<decltype((D))>(D)
respectively. If such initialization is invalid,C | D
is also invalid.- Let
c
andd
be the stored copies (with the same constness and value category asE
), andR
be a range object, the following expressions are equivalent:
d(c(R))
R | c | d
E(R)
R | E // R | (C | D)
Notes
operator()
is unsupported for volatile-qualified or const-volatile-qualified version of range adaptor object closure types.
Objects whose type is the same as one of the following objects (ignoring cv-qualification) are range adaptor closure objects:
- unary range adaptor objects,
- objects of user-defined types that meet the requirements of implementing a range adaptor closure object (since C++23),
- the results of binding trailing arguments by range adaptor objects, and
- the results of chaining two range adaptor closure objects by
operator|
.