std::ranges::views::counted - cppreference.com
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(desde C++20) | |
| Signatura de la llamada |
||
|
|
(desde C++20) | |
Una vista contada presenta una vista (view) de los elementos del rango contado [i, n) para algún iterador i y un entero no negativo n.
Un rango contado [i, n) son los n elementos comenzando con el elemento al que apunta i y hasta, pero no incluyendo el elemento, si lo hay, al que apunta el resultado de n aplicaciones de ++i.
Si n == 0, el rango contado es válido y está vacío. De lo contrario, el rango contado solo es válido si n es positiva, i es desreferenciable, y [++i, --n) es un rango contado válido.
Formalmente, si it y count son expresiones, T es std::decay_t<decltype((it))>, y D es std::iter_difference_t<T>, entonces:
- si
Tmodelainput_or_output_iteratorydecltype((count))modelastd::convertible_to<D>,- si
Tmodelacontiguous_iterator, entoncesviews::counted(it, count)es equivalente en expresión astd::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))), - de lo contrario, si
Tmodelarandom_access_iterator, entoncesviews::counted(it, count)es equivalente en expresión aranges::subrange(it, it + static_cast<D>(count)), - de lo contrario,
views::counted(it, count)es equivalente en expresión aranges::subrange(std::counted_iterator(it, count), std::default_sentinel).
- si
- De lo contrario,
views::counted(it, count)está mal formada.
Equivalente en expresión
La expresión e es equivalente-en-expresión a la expresión f, si e y f tienen los mismos efectos, ambas potencialmente lanzan o ambas potencialmente no lanzan (es decir, noexcept (e) == noexcept(f)), y ambas son subexpresiones constantes o ambas no son subexpresiones constantes.
Objetos de punto de personalización
El nombre views::view_counted denota un objeto de punto de personalización, que es un objeto función const de un tipo clase literal semiregular (denotado, a efectos de exposición, como view_counted_ftor). Todos los ejemplares de view_counted_ftor son iguales. Por lo tanto, views::view_counted puede copiarse libremente y sus copias pueden usarse indistintamente.
Dado un conjunto de tipos Args..., si std::declval<Args>()... cumple con los requerimientos para los argumentos de views::view_counted mencionado anteriormente, view_counted_ftor satisfará a std::invocable<const view_counted_ftor&, Args...>. De lo contrario, ningún operador de llamada a función de view_counted_ftor participa en la resolución de sobrecarga.
Ejemplo
#include <ranges> #include <iostream> int main() { const int a[] = {1, 2, 3, 4, 5, 6, 7}; for(int i : std::views::counted(a, 3)) std::cout << i << ' '; std::cout << '\n'; const auto il = {1, 2, 3, 4, 5}; for (int i : std::views::counted(il.begin() + 1, 3)) std::cout << i << ' '; std::cout << '\n'; }
Salida:
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P2393R1 | C++20 | Una conversión implícita de un tipo de clase entero a size_t podría ser inválida.
|
Se hizo explícita. |