C ++ 20 представил std::ssize()
бесплатную функцию, как показано ниже:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Возможная реализация, похоже, использует static_cast
для преобразования возвращаемого значения функции- size()
члена cl ass C в ее подписанный аналог.
Поскольку size()
функция-член C всегда возвращает неотрицательные значения, зачем кому-то хранить их в переменных со знаком? Если кто-то действительно хочет, это очень просто static_cast
.
Почему std::ssize()
введен в C ++ 20?
ssizeof
оператора добавляют .char
имеет a ) унаследованы от C и, по крайней мере, несколько смягчены(u)intX_t
, но это все еще бесконечный источник столь же тонких и критических ошибок. Такие вещи, какssize
просто исправления, и потребуется некоторое время (возможно, «навсегда»), пока они не войдут в общие «руководства по передовым методам», которым люди (могут) неукоснительно следовать.(u)intX_t
типы необязательно , не так ли?)Ответы:
Обоснование описано в этой статье . Цитата:
источник
for(int i = 0; i < container.ssize() - 1; ++i)
Пример также довольно убедительныйНезаконно украдено у Эрика Ниблера:
источник
Int
которому (размер машинного слова) должен быть типом общей валюты целых чисел, даже если имеют смысл только положительные числа (например, индексация массива). Любое отклонение от него должно быть обосновано. Приятно не беспокоиться о повсюду слепках.