cpp/named req/RangeAdaptorClosureObject

Range adaptor closure objects are s that are callable via the pipe operator: if is a range adaptor closure object and  is a, these two expressions are equivalent:

Two range adaptor closure objects can be chained by to produce another range adaptor closure object: if  and  are range adaptor closure objects, then  produces a range adaptor closure object  with the following properties:


 * stores a copy of and, direct-non-list-initialized from  and  respectively. If such initialization is invalid,  is also invalid.
 * Let and  be the stored copies (with the same constness and value category as ), and  be a  object, the following expressions are equivalent:

Notes: 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,


 * the results of binding trailing arguments by range adaptor objects, and
 * the results of chaining two range adaptor closure objects by.