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()。数组和函数在绑定时转换成指针。