std::ranges::ssize
| Definido en el encabezado <ranges>
|
||
| Definido en el encabezado <iterator>
|
||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ ssize = /* unspecified */;
}
|
(desde C++20) (objeto de punto de personalización) |
|
| Signatura de llamada |
||
template< class T >
requires /* see below */
constexpr auto ssize( T&& t );
|
(desde C++20) | |
Calcula el número de elementos en t en tiempo constante y convierte el resultado a un tipo con signo.
Dada la subexpresión de la cual t denota el objeto resultado (posiblemente materializado) como E:
- Si
ranges::size(t)está mal formado,ranges::ssize(E)también lo está. - De lo contrario, sea
Signedigual amake-signed-like-t<decltype(ranges::size(t))>:- Si std::ptrdiff_t es más ancho que
Signed,ranges::ssize(E)es equivalente en expresión astatic_cast<std::ptrdiff_t>(ranges::size(t)). - De lo contrario,
ranges::ssize(E)es equivalente en expresión astatic_cast<Signed>(ranges::size(t)).
- Si std::ptrdiff_t es más ancho que
Objetos de punto de personalización
El nombre
ranges::ssize
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 ranges :: ssize ( e ) es válido para una expresión e , el tipo de retorno es un tipo similar a entero con signo .
Ejemplo
#include <array> #include <iostream> #include <ranges> #include <type_traits> int main() { std::array arr{1, 2, 3, 4, 5}; auto s = std::ranges::ssize(arr); std::cout << "ranges::ssize(arr) = " << s << '\n' << "ranges::ssize is " << (std::is_signed_v<decltype(s)> ? "signed" : "unsigned") << '\n'; std::cout << "reversed arr: "; for (--s; s >= 0; --s) std::cout << arr[s] << ' '; std::cout << "\n" "s = " << s << '\n'; }
Salida:
ranges::ssize(arr) = 5 ranges::ssize is signed reversed arr: 5 4 3 2 1 s = -1
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 |
|---|---|---|---|
| LWG 3403 | C++20 |
ranges::size
funcionaba para algunos tipos no-range pero
ranges::ssize
no funcionaba
|
corregido para funcionar |
Véase también
|
(C++20)
|
devuelve un entero igual al tamaño de un rango
(objeto de punto de personalización) |
|
(C++20)
|
especifica que un rango conoce su tamaño en tiempo constante
(concepto) |
|
(C++20)
|
devuelve la distancia entre un iterador y un centinela, o entre el inicio y fin de un rango
(objeto función algoritmo) |
|
(C++17)
(C++20)
|
devuelve el tamaño de un contenedor o array
(plantilla de función) |