跳到主要内容

C++ 命名要求: RangeAdaptorObject (自 C++20 起)

范围适配器对象是定制点对象,它们接受viewable_range作为其第一个参数并返回一个视图。一些范围适配器对象是一元,即它们只接受一个viewable_range作为其唯一参数。其他范围适配器对象接受一个viewable_range和其他尾随参数。

如果范围适配器对象只接受一个参数,它也是一个RangeAdaptorClosureObject

如果范围适配器对象接受多个参数,它也支持部分应用:设

  • a是这样一个范围适配器对象,且
  • args...是参数(通常适用于尾随参数),
  • 表达式a(args...)具有以下属性
    • 当且仅当args...中的每个参数e(其中Edecltype((e)))满足std::is_constructible_v<std::decay_t<E>, E>true时,它才有效,
    • 当调用有效时,其结果对象会存储一个std::decay_t类型的子对象,该子对象通过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()。数组和函数在绑定时会转换为指针。

C++ 命名要求: RangeAdaptorObject (自 C++20 起)

范围适配器对象是定制点对象,它们接受viewable_range作为其第一个参数并返回一个视图。一些范围适配器对象是一元,即它们只接受一个viewable_range作为其唯一参数。其他范围适配器对象接受一个viewable_range和其他尾随参数。

如果范围适配器对象只接受一个参数,它也是一个RangeAdaptorClosureObject

如果范围适配器对象接受多个参数,它也支持部分应用:设

  • a是这样一个范围适配器对象,且
  • args...是参数(通常适用于尾随参数),
  • 表达式a(args...)具有以下属性
    • 当且仅当args...中的每个参数e(其中Edecltype((e)))满足std::is_constructible_v<std::decay_t<E>, E>true时,它才有效,
    • 当调用有效时,其结果对象会存储一个std::decay_t类型的子对象,该子对象通过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()。数组和函数在绑定时会转换为指针。