C ++ 20 introdujo la std::ssize()
función gratuita de la siguiente manera:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Una posible implementación parece utilizar static_cast
para convertir el valor de retorno de la size()
función miembro de cl ass C en su contraparte firmada.
Dado que la size()
función miembro de C siempre devuelve valores no negativos, ¿por qué alguien querría almacenarlos en variables firmadas? En caso de que uno realmente quiera, es una cuestión de simple static_cast
.
¿Por qué se std::ssize()
introduce en C ++ 20?
ssizeof
operador también.char
tiene) se heredan de C y al menos se alivian un poco(u)intX_t
, pero sigue siendo una fuente inagotable de errores igualmente sutiles y críticos. Cosas comossize
son solo parches, y tomará un tiempo (tal vez "para siempre") hasta que esto se sumerja en las "guías de mejores prácticas" comunes que la gente (puede) seguir rigurosamente.(u)intX_t
tipos son opcionales , ¿verdad?)Respuestas:
La justificación se describe en este documento . Una cita:
fuente
for(int i = 0; i < container.ssize() - 1; ++i)
ejemplo también es bastante convincenteGratuitamente robada de Eric Niebler:
fuente
Int
deberían ser los tipos de moneda común de números enteros, incluso cuando solo los números positivos tienen sentido (como indexar una matriz). Cualquier desviación del mismo debe estar bien fundada. Es bueno no tener que preocuparse por los yesos en todas partes.