Requisitos denominados de C++: RangeAdaptorObject (desde C++20)
Los objetos adaptadores de rango son objetos de punto de personalización que aceptan un rango visible (viewable_range) como primer argumento y devuelven una vista (view). Algunos objetos adaptadores de rango son unarios, es decir, toman un rango visible como su único argumento. Otros objetos adaptadores de rango toman un rango visible y otros argumentos al final.
Si un objeto adaptador de rango toma solo un argumento, también es un objeto cierre adaptador de rango.
Si un objeto adaptador de rango toma más de un argumento, también admite la aplicación parcial: sea
atal objeto adaptador de rango, yargs...sean argumentos (generalmente adecuados como argumentos al final),
la expresión a(args...) tiene las siguientes propiedades:
- es válida si y solo si para cada argumento
eenargs...tal queEesdecltype((e)),std::is_constructible_v<std::decay_t<E>, E>estrue, - cuando la llamada es válida, su objeto resultado almacena un subobjeto de tipo
std::decay_t<E>inicializado directamente sin usar inicialización de lista constd::forward<E>(e), para cada argumentoeenargs...(en otras palabras, los objetos adaptadores de rango vinculan los argumentos por valor), - el objeto resultado es un objeto cierre adaptador de rango.
- llamar al objeto cierre adaptador de rango reenvía los argumentos vinculados (si los hay) al objeto adaptador de rango asociado. Los argumentos vinculados (si los hay) se consideran que tienen la categoría de valor y la calificación
const volatiledel objeto cierre adaptador de rango. En otras palabras,a(args...)(r)es equivalente astd::bind_back(a, args...)(r)(pero el primero también admite la sintaxis de tubería). (desde C++23)
Al igual que otros objetos de puntos de personalización, sea
aun objeto de la versión no calificada-const volatiledel tipo de cualquier objeto adaptador de rango,args...cualquier grupo de argumentos que satisfaga las restricciones del operadoroperator()del tipo dea,
las llamadas a
a(args...),std::as_const(a)(args...),std::move(a)(args...), ystd::move(std::as_const(a))(args...)
son todas equivalentes.
El objeto resultado de cada una de estas expresiones es o bien un objeto vista (view) o un objeto cierre adaptador de rango.
Notas
El operador operator() no se admite para la versión calificada volatile o para la versión calificada const volatile de los tipos adaptadores de rango. Los arrays y funciones se convierten a punteros al vincularse.