C++ 具名要求:范围适配器对象 (RangeAdaptorObject) (C++20 起)
来自cppreference.com
范围适配器对象是定制点对象,它接收 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::forward<E>(e)直接非列表初始化的一个std::decay_t<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()。数组和函数在绑定时转换成指针。