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_castpara 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?

ssizeofoperador también.chartiene) 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 comossizeson 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_ttipos 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
Intdeberí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.