命名空间
变体
操作

C++ 命名需求: RangeAdaptorObject (自 C++20 起)

来自 cppreference.com
 
 
C++ 命名需求
 

范围适配器对象是定制点对象,它们接受 viewable_range 作为它们的第一个参数,并返回一个 view。一些范围适配器对象是一元的,即它们只接受一个 viewable_range 作为它们的唯一参数。其他范围适配器对象接受一个 viewable_range 以及其他尾随参数。

如果范围适配器对象只接受一个参数,它也是一个 RangeAdaptorClosureObject

如果范围适配器对象接受多个参数,它也支持部分应用:令

  • a 为这样一个范围适配器对象,以及
  • args... 为参数(通常适合尾随参数),

表达式 a(args...) 具有以下属性

  • 它仅在以下情况下有效:对于 args... 中的每个参数 e,其中 Edecltype((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() 约束的任何参数组,

对以下内容的调用

都是等效的。

这些表达式中的每一个的结果对象都是一个 view 对象或一个 RangeAdaptorClosureObject

[编辑] 注释

operator() 不支持范围适配器对象类型的易失限定或常量易失限定版本。数组和函数在绑定时被转换为指针。