C ++ 20 introduziu a std::ssize()
função livre conforme abaixo:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Uma possível implementação parece usar static_cast
, para converter o valor de retorno da size()
função-membro de cl ass C em sua contraparte assinada.
Visto que a size()
função-membro de C sempre retorna valores não negativos, por que alguém iria querer armazená-los em variáveis com sinal? Caso se queira mesmo, é uma questão de simples static_cast
.
Por que é std::ssize()
introduzido no C ++ 20?
ssizeof
operador também.char
possui) são herdadas de C e pelo menos um pouco atenuadas por(u)intX_t
, mas ainda é uma fonte infinita de bugs igualmente sutis e críticos. Coisas comossize
são apenas patches, e vai demorar um pouco (talvez "para sempre") até que isso afunde nos "guias de práticas recomendadas" que as pessoas (podem) seguir rigorosamente.(u)intX_t
tipos são opcionais , não é?)Respostas:
A justificativa é descrita neste artigo . Uma citação:
fonte
for(int i = 0; i < container.ssize() - 1; ++i)
exemplo também é bastante convincenteRoubado gratuitamente de Eric Niebler:
fonte
Int
deve ser o tipo de moeda comum para números inteiros, mesmo quando apenas números positivos fazem sentido (como indexar uma matriz). Qualquer desvio deve ser bem fundamentado. É bom não precisar se preocupar com elencos em todos os lugares.