std::ranges::end
| Definido en el encabezado <ranges>
|
||
| Definido en el encabezado <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ end = /* unspecified */;
}
|
(desde C++20) (objeto de punto de personalización) |
|
| Signatura de llamada |
||
template< class T >
requires /* see below */
constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
|
(desde C++20) | |
Devuelve un centinela que indica el final de un rango.
Si el argumento es un lvalue o ranges::enable_borrowed_range<std::remove_cv_t<T>> es true, entonces una llamada a ranges::end es equivalente en expresión a:
t + std::extent_v<T>sittiene un tipo de arreglo de límite conocido.- Si
std::remove_all_extents_t<std::remove_reference_t<T>>está incompleto, entonces la llamada aranges::endestá mal formada, no se requiere diagnóstico.
- Si
- En caso contrario, decay-copy
(t.end())(hasta C++23)auto(t.end())(desde C++23), si esa expresión es válida y su tipo modelastd::sentinel_for<ranges::iterator_t<T>>. - En caso contrario, decay-copy
(end(t))(hasta C++23)auto(end(t))(desde C++23), siTes un tipo clase o enumeración, esa expresión es válida y su tipo convertido modelastd::sentinel_for<ranges::iterator_t<T>>, donde el significado deendse establece como si se realizara búsqueda dependiente de argumentos solamente.
En todos los demás casos, una llamada a ranges::end está mal formada, lo que puede resultar en fallo de sustitución cuando la llamada a ranges::end aparece en el contexto inmediato de una instanciación de plantilla.
Objetos de punto de personalización
El nombre
ranges::end
denota un
objeto de punto de personalización
, que es un
objeto función
constante de un tipo de clase
literal
semiregular
. Consulte
CustomizationPointObject
para más detalles.
Notas
Si el argumento es un rvalue (es decir,
T
es un tipo objeto) y
ranges::
enable_borrowed_range
<
std::
remove_cv_t
<
T
>>
es
false
, o si es de un tipo array de límite desconocido, la llamada a
ranges::end
está mal formada, lo que también resulta en fallo de sustitución.
Si
ranges
::
end
(
std::
forward
<
T
>
(
t
)
)
es válido, entonces
decltype
(
ranges
::
end
(
std::
forward
<
T
>
(
t
)
)
)
y
decltype
(
ranges::
begin
(
std::
forward
<
T
>
(
t
)
)
)
modelan
std::sentinel_for
en todos los casos, mientras que
T
modela
std::ranges::range
.
El estándar C++20 requiere que si la llamada subyacente a la función
end
devuelve un prvalue, el valor de retorno se construye por movimiento desde el objeto temporal materializado. Todas las implementaciones devuelven directamente el prvalue en su lugar. El requisito se corrige mediante la propuesta posterior a C++20
P0849R8
para que coincida con las implementaciones.
Ejemplo
#include <algorithm> #include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> vec{3, 1, 4}; if (std::ranges::find(vec, 5) != std::ranges::end(vec)) std::cout << "found a 5 in vector vec!\n"; int arr[]{5, 10, 15}; if (std::ranges::find(arr, 5) != std::ranges::end(arr)) std::cout << "found a 5 in array arr!\n"; }
Salida:
found a 5 in array arr!
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| P2602R2 | C++20 |
existe maquinaria para prohibir ciertos
end
no miembro encontrados mediante
ADL
|
se eliminó dicha maquinaria |
Véase también
|
(C++20)
|
retorna un centinela que indica el final de un rango de solo lectura
(objeto de punto de personalización) |
|
(C++20)
|
retorna un iterador al inicio de un rango
(objeto de punto de personalización) |
|
(C++11)
(C++14)
|
retorna un iterador al final de un contenedor o array
(plantilla de función) |