C++ 命名要求: RangeAdaptorObject (自 C++20 起)
来自 cppreference.cn
范围适配器对象是定制点对象,它们接受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时才有效, - 当调用有效时,其结果对象存储一个类型为std::decay_t<E>的子对象,对于args...中的每个参数e,该子对象通过std::forward<E>(e)进行直接非列表初始化(换句话说,范围适配器对象通过值绑定参数),
- 结果对象是一个RangeAdaptorClosureObject,
- 调用RangeAdaptorClosureObject会将绑定的参数(如果有)转发到关联的范围适配器对象。绑定的参数(如果有)被视为具有RangeAdaptorClosureObject的值类别和cv限定。 换句话说,a(args...)(r)等价于std::bind_back(a, args...)(r)(但前者也支持管道语法)。(自 C++23 起)
像其他定制点对象一样,令
- a是任何范围适配器对象类型经cv-unqualified后的对象,
- args...是满足a的类型中operator()约束的任意一组参数,
对以下表达式的调用
- a(args...),
- std::as_const(a)(args...),
- std::move(a)(args...),以及
- std::move(std::as_const(a))(args...)
都等价。
这些表达式的结果对象要么是view
对象,要么是RangeAdaptorClosureObject。
[编辑] 注意
范围适配器对象类型的volatile-qualified或const-volatile-qualified版本不支持operator()。数组和函数在绑定时会转换为指针。