A *range adaptor closure object* is a unary function object that accepts
a viewable_range argument and returns a view.

For
a range adaptor closure object C and an expression R such that
decltype((R)) models viewable_range, the following
expressions are equivalent and yield a view:
C(R)
R | C

Given an additional range adaptor closure object D,
the expression C | D produces another range adaptor
closure object E.

E is a perfect forwarding call wrapper ([func.require])
with the following properties:

The expression C | D is well-formed if and only if
the initializations of the state entities of E are all well-formed.

A *range adaptor object* is a
customization point object ([customization.point.object])
that accepts a viewable_range as its first argument and returns a
view.

If a range adaptor object adaptor accepts more than one argument,
then let range be an expression
such that decltype((range)) models viewable_range,
let args... be arguments
such that adaptor(range, args...) is a well-formed expression
as specified in the rest of subclause ([range.adaptors]), and
let BoundArgs be a pack
that denotes decay_t<decltype((args))>....

The expression adaptor(args...) produces a range adaptor closure object f
that is a perfect forwarding call wrapper with the following properties:

- Its target object is a copy of adaptor.
- Its bound argument entities bound_args consist of objects of types BoundArgs... direct-non-list-initialized with std::forward<decltype((args))>(args)..., respectively.
- Its call pattern is adaptor(r, bound_args...), where r is the argument used in a function call expression of f.

The expression adaptor(args...) is well-formed if and only if
the initialization of the bound argument entities of the result,
as specified above, are all well-formed.