C++ 命名要求: RangeAdaptorObject (自 C++20 起)
范围适配器对象是定制点对象,它们接受viewable_range作为其第一个参数并返回一个视图。一些范围适配器对象是一元,即它们只接受一个viewable_range作为其唯一参数。其他范围适配器对象接受一个viewable_range和其他尾随参数。
如果范围适配器对象只接受一个参数,它也是一个RangeAdaptorClosureObject。
如果范围适配器对象接受多个参数,它也支持部分应用:设
a
是这样一个范围适配器对象,且args...
是参数(通常适用于尾随参数),- 表达式
a(args...)
具有以下属性- 当且仅当
args...
中的每个参数e
(其中E是decltype((e))
)满足std::is_constructible_v<std::decay_t<E>, E>
为true时,它才有效, - 当调用有效时,其结果对象会存储一个
std::decay_t
类型的子对象,该子对象通过std::forward<E>(e)
直接非列表初始化,适用于args...
中的每个参数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()
。数组和函数在绑定时会转换为指针。