命名空间
变体
视图
操作

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

来自 cppreference.cn
< cpp‎ | named req
 
 
C++ 命名要求
随机数
(C++11)
并发
(C++11)
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)
(C++17)
(C++14)
范围
RangeAdaptorObject
(C++20)
多维视图
(C++23)
(C++23)
其他
(C++11)
(C++11)
(C++11)
(C++11)

 

范围适配器对象 是自定义点对象,它接受 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

[编辑] 注解

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