跳到主要内容

C++ 命名要求
RangeAdaptorClosureObject (C++20 起)

范围适配器闭包对象是可通过管道运算符调用的函数对象:如果 C 是一个范围适配器闭包对象,且 R 是一个范围,则这两个表达式是等价的

C(R)
R | C

两个范围适配器闭包对象可以通过 operator| 链式连接以产生另一个范围适配器闭包对象:如果 CD 是范围适配器闭包对象,则 C | D 产生一个具有以下属性的范围适配器闭包对象 E

  • E 存储 CD 的副本,分别从 std::forward<decltype((C))>(C)std::forward<decltype((D))>(D) 进行直接非列表初始化。如果这样的初始化无效,则 C | D 也无效。
  • cd 为存储的副本(具有与 E 相同的 constness 和值类别),R 为一个范围对象,以下表达式是等价的
d(c(R))
R | c | d
E(R)
R | E // R | (C | D)

备注

operator() 不支持范围适配器对象闭包类型的 volatile 限定或 const-volatile 限定版本。

类型与以下对象之一相同的对象(忽略 cv 限定符)是范围适配器闭包对象

  • 一元范围适配器对象,
  • 满足实现范围适配器闭包对象的要求的用户定义类型的对象(C++23 起),
  • 通过范围适配器对象绑定尾部参数的结果,以及
  • 通过 operator| 链式连接两个范围适配器闭包对象的结果。

C++ 命名要求
RangeAdaptorClosureObject (C++20 起)

范围适配器闭包对象是可通过管道运算符调用的函数对象:如果 C 是一个范围适配器闭包对象,且 R 是一个范围,则这两个表达式是等价的

C(R)
R | C

两个范围适配器闭包对象可以通过 operator| 链式连接以产生另一个范围适配器闭包对象:如果 CD 是范围适配器闭包对象,则 C | D 产生一个具有以下属性的范围适配器闭包对象 E

  • E 存储 CD 的副本,分别从 std::forward<decltype((C))>(C)std::forward<decltype((D))>(D) 进行直接非列表初始化。如果这样的初始化无效,则 C | D 也无效。
  • cd 为存储的副本(具有与 E 相同的 constness 和值类别),R 为一个范围对象,以下表达式是等价的
d(c(R))
R | c | d
E(R)
R | E // R | (C | D)

备注

operator() 不支持范围适配器对象闭包类型的 volatile 限定或 const-volatile 限定版本。

类型与以下对象之一相同的对象(忽略 cv 限定符)是范围适配器闭包对象

  • 一元范围适配器对象,
  • 满足实现范围适配器闭包对象的要求的用户定义类型的对象(C++23 起),
  • 通过范围适配器对象绑定尾部参数的结果,以及
  • 通过 operator| 链式连接两个范围适配器闭包对象的结果。