C++ 具名要求:范围适配器对象 (RangeAdaptorObject) (C++20 起)
来自cppreference.com
范围适配器对象是接收 viewable_range
作为其首参数并返回 view
的定制点对象。一些范围适配器对象是一元的,即它们接收一个 viewable_range
作为其仅有的参数。其他范围适配器对象接收一个 viewable_range
和其他尾随参数。
如果范围适配器对象仅仅接受一个参数,则他同时也是 范围适配器闭包对象 (RangeAdaptorClosureObject) 。
若范围适配器接收多于一个参数,则它亦支持部分应用:令
- a 为范围适配器对象,而
- args... 为参数(通常适合作为尾随参数),
则表达式 a(args...) 拥有下列属性:
- 它合法当且仅当对每个 args... 中的 e ,设
E
为 decltype((e)) , std::is_constructible_v<std::decay_t<E>, E> 为 true , - 当调用合法时,其结果对象对每个 e 中的 args... 存储以 std::forward<E>(e) 直接非列表初始化的 std::decay_t<E> 类型子对象,而且
- 结果对象是 范围适配器闭包对象 (RangeAdaptorClosureObject) ,
- 调用 范围适配器闭包对象 (RangeAdaptorClosureObject) 将被绑定的参数(如果有)转发到关联的范围适配器对象中。被绑定的参数(如果有)被视作和 范围适配器闭包对象 (RangeAdaptorClosureObject) 具有相同的值类别和 cv-限定。换言之,a(args...)(r) 等价于 std::bind_back(a, args...)(r) (但前者还支持管道语法)。 (C++23 起)
类似其他定制点对象,令
-
a
为任何范围适配器类型的 cv 无限定版本的对象, - args... 任何满足
a
的 operator() 的约束参数组,
对
- a(args...)、
- std::as_const(a)(args...)、
- std::move(a)(args...) 及
- std::move(std::as_const(a))(args...)
的调用全部等价。
每个这些表达式的结果对象是一个 view
对象或 范围适配器闭包对象 (RangeAdaptorClosureObject) 。
注:范围适配器类型的 volatile 限定或 const-volatile 限定版本不支持 operator() 。数组和函数在绑定时转换成指针。