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/w/cpp/named_req/RangeAdaptorObject

Spec-Zone.ru

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