命名空间
变体
操作

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

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围
(C++11)




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
RangeAdaptorObject(范围适配器对象)
(C++20)
多维视图
(C++23)
其他

 

范围适配器对象是定制点对象,它们接受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>的子对象,对于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()约束的任意一组参数,

对以下表达式的调用

都等价。

这些表达式的结果对象要么是view对象,要么是RangeAdaptorClosureObject

[编辑] 注意

范围适配器对象类型的volatile-qualified或const-volatile-qualified版本不支持operator()。数组和函数在绑定时会转换为指针。