C ++ 20 a introduit lestd::ssize()
fonction gratuite comme ci-dessous:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Une implémentation possible semble utiliser static_cast
, pour convertir la valeur de retour de la size()
fonction membre de cl ass C en son équivalent signé.
Depuis le size()
fonction membre de C renvoie toujours des valeurs non négatives, pourquoi quelqu'un voudrait-il les stocker dans des variables signées? Au cas où on le voudrait vraiment, c'est simple static_cast
.
Pourquoi est std::ssize()
introduit dans C ++ 20?
ssizeof
opérateur.char
a) sont héritées de C et au moins quelque peu atténuées par(u)intX_t
, mais c'est toujours une source infinie de bogues tout aussi subtils et critiques. Des choses commessize
ne sont que des correctifs, et cela prendra un certain temps (peut-être "pour toujours") jusqu'à ce que cela pénètre dans les "guides des meilleures pratiques" que les gens (peuvent) suivre rigoureusement.(u)intX_t
types sont en option , pensez - vous?)Réponses:
La justification est décrite dans cet article . Une citation:
la source
for(int i = 0; i < container.ssize() - 1; ++i)
exemple est également assez convaincantVolé gratuitement à Eric Niebler:
la source
Int
devrait être les types de monnaie courants des nombres entiers, même lorsque seuls les nombres positifs ont un sens (comme l'indexation d'un tableau). Tout écart par rapport à celui-ci doit être fondé. C'est bien de ne pas avoir à s'inquiéter des lancers partout.