C ++ 20 wprowadził std::ssize()
bezpłatną funkcję, jak poniżej:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Wydaje się static_cast
, że możliwa implementacja polega na przekształceniu wartości zwracanej size()
funkcji składowej klasy C na jej podpisany odpowiednik.
Ponieważ size()
funkcja składowa C zawsze zwraca wartości nieujemne, dlaczego ktoś miałby chcieć przechowywać je w podpisanych zmiennych? Na wypadek, gdyby ktoś naprawdę chciał, jest to prosta sprawa static_cast
.
Dlaczego std::ssize()
wprowadzono w C ++ 20?
ssizeof
operator.char
ma) są dziedziczone po C i przynajmniej w pewnym stopniu łagodzone przez(u)intX_t
, ale wciąż jest to nieskończone źródło równie subtelnych i krytycznych błędów.ssize
Takie rzeczy są tylko łatkami i zajmie trochę czasu (może „na zawsze”), zanim zagłębią się w powszechne „przewodniki po najlepszych praktykach”, których ludzie (mogą) rygorystycznie przestrzegać.(u)intX_t
typy są opcjonalne , prawda?)Odpowiedzi:
Uzasadnienie zostało opisane w tym artykule . Cytat:
źródło
for(int i = 0; i < container.ssize() - 1; ++i)
Przykładem jest również dość przekonująceNieodpłatnie skradzione Ericowi Nieblerowi:
źródło
Int
powinna być typową walutą liczb całkowitych, nawet jeśli tylko liczby dodatnie mają sens (na przykład indeksowanie tablicy). Wszelkie odstępstwa od niej powinny być uzasadnione. Miło jest nie martwić się o rzuty wszędzie.