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, - 当调用有效时,它的结果对象存储一个类型为 std::decay_t<E> 的子对象,该子对象使用 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。
[编辑] 注释
operator() 不支持范围适配器对象类型的易失限定或常量易失限定版本。数组和函数在绑定时被转换为指针。