C++ 具名要求:范围适配器闭包对象 (RangeAdaptorClosureObject) (C++20 起)
来自cppreference.com
范围适配器闭包对象 是可以通过管道操作符调用的 函数对象 (FunctionObject) :若 C 是范围适配器闭包对象且 R 实现了 range
,则下列两个表达式等价:
C(R) R | C
两个范围适配器闭包对象能由 operator| 连接以产生另一个范围适配器闭包对象:若 C 与 D 为范围适配器闭包对象,则 C | D 产生范围适配器闭包对象 E 且他满足如下性质:
- E 存储 C 和 D 的复制,分别按照 std::forward<decltype((C))>(C) 和 std::forward<decltype((D))>(D) 直接非列表初始化而来。如果这样的初始化非法,则 C | D 亦非法。
- 令 c 和 d 表示被保存的副本(具有同 E 一样的常量性和值类别),且令 R 是
range
对象,则如下表达式是等价的:
d(c(R)) R | c | d E(R) R | E // R | (C | D)
注意:范围适配器闭包类型的 volatile 限定或 const-volatile 限定版本不支持 operator() 。
范围适配器闭包对象是和如下之一对象类型一致(忽略 cv-限定)的对象:
- 一元范围适配器对象,
|
(C++23 起) |
- 通过范围适配器对象绑定尾随参数的结果,以及
- 使用 operator| 串联的两个范围适配器闭包对象的结果。