C ++ 20 memperkenalkan std::ssize()
fungsi gratis seperti di bawah ini:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Sebuah implementasi yang mungkin tampaknya menggunakan static_cast
, untuk mengubah nilai kembali dari size()
fungsi anggota cl ass C menjadi mitra yang ditandatangani.
Karena size()
fungsi anggota C selalu mengembalikan nilai non-negatif, mengapa ada orang yang ingin menyimpannya dalam variabel bertanda? Jika seseorang benar-benar menginginkannya, ini masalah sederhana static_cast
.
Mengapa std::ssize()
diperkenalkan di C ++ 20?
ssizeof
operator juga.char
dimiliki) diwarisi dari C dan setidaknya diringankan oleh(u)intX_t
, tetapi itu masih merupakan sumber bug yang sama-sama halus dan kritis tanpa akhir. Hal-hal sepertissize
itu hanyalah tambalan, dan akan memakan waktu (mungkin "selamanya") sampai ini masuk ke dalam "panduan praktik terbaik" umum yang (dapat) diikuti orang dengan ketat.(u)intX_t
jenis yang opsional , kan?)Jawaban:
Alasannya dijelaskan dalam makalah ini . Kutipan:
sumber
for(int i = 0; i < container.ssize() - 1; ++i)
contoh adalah juga cukup menarikDicuri secara serampangan dari Eric Niebler:
sumber
Int
harus menjadi jenis mata uang umum dari bilangan bulat, bahkan di mana hanya bilangan positif yang masuk akal (seperti mengindeks array). Setiap penyimpangan dari itu harus beralasan. Sangat menyenangkan tidak perlu khawatir tentang pemeran di mana-mana.