C++ 命名要求: RangeAdaptorObject (自 C++20 起)
来自 cppreference.cn
范围适配器对象 是自定义点对象,它接受 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。
[编辑] 注解
不支持对范围适配器对象类型的 volatile 限定或 const-volatile 限定版本使用 operator()。数组和函数在绑定时会被转换为指针。