C++ named requirements: RangeAdaptorObject (since C++20)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
范围适配器对象
是定制点对象,它们接受
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 时该调用才合法, - 当调用合法时,其结果对象会为 args... 中的每个实参 e 存储一个类型为 std:: decay_t < E > 的子对象,该子对象通过 std:: forward < E > ( 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 ( ) 不支持限定为 volatile 或 const-volatile 的范围适配器对象类型。在绑定时,数组和函数会被转换为指针。