Spec-Zone.ru › C++

Именованные требования C++: RangeAdaptorObject (начиная с C++20)

Объекты адаптеров диапазонов — это объекты точек настройки, которые принимают viewable_range в качестве первых аргументов и возвращают view. Некоторые объекты адаптеров диапазонов являются унарными, то есть принимают один viewable_range в качестве единственного аргумента. Другие объекты адаптеров диапазонов принимают viewable_range и другие последующие аргументы.

Если объект адаптера диапазона принимает только один аргумент, он также является объектом замыкания адаптера диапазона (RangeAdaptorClosureObject).

Если объект адаптера диапазона принимает более одного аргумента, он также поддерживает частичное применение: пусть

  • a — такой объект адаптера диапазона, а
  • args... — аргументы (обычно подходящие для последующих аргументов),

выражение a(args...) обладает следующими свойствами:

  • оно корректно тогда и только тогда, когда для каждого аргумента e в args..., такого что E является decltype((e)), выполняется условие std::is_constructible_v<std::decay_t<E>, E> является true,
  • если вызов корректен, его результирующий объект хранит подобъект типа std::decay_t<E>, напрямую инициализированный без списка с помощью std::forward<E>(e) для каждого аргумента e в args... (другими словами, объекты адаптеров диапазонов связывают аргументы по значению),
  • результирующий объект является объектом замыкания адаптера диапазона (RangeAdaptorClosureObject),
  • вызов объекта замыкания адаптера диапазона (RangeAdaptorClosureObject) передаёт связанные аргументы (если они есть) соответствующему объекту адаптера диапазона. Считается, что связанные аргументы (если они есть) имеют категорию значения и cv-квалификацию объекта замыкания адаптера диапазона (RangeAdaptorClosureObject). Другими словами, a(args...)(r) эквивалентно std::bind_back(a, args...)(r) (однако первый вариант также поддерживает синтаксис с оператором конвейера).(начиная с C++23)

Как и для других объектов точек настройки, пусть

  • a — объект неквалифицированной по cv версии типа любого объекта адаптера диапазона,
  • args... — любая группа аргументов, удовлетворяющая ограничениям operator() типа a,

вызовы

  • a(args...),
  • std::as_const(a)(args...),
  • std::move(a)(args...) и
  • std::move(std::as_const(a))(args...)

эквивалентны.

Результирующий объект каждого из этих выражений является либо объектом view, либо объектом замыкания адаптера диапазона (RangeAdaptorClosureObject).

Примечания

operator() не поддерживается для типов объектов адаптеров диапазонов с квалификаторами volatile или const-volatile. При связывании массивы и функции преобразуются в указатели.

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/RangeAdaptorObject

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API