Jawaban singkat:
hampir tidak pernah
jawaban panjang:
Setiap kali Anda perlu memiliki vektor char yang lebih besar 2gb pada sistem 32 bit. Dalam setiap kasus penggunaan lainnya, menggunakan jenis yang ditandatangani jauh lebih aman daripada menggunakan jenis yang tidak ditandatangani.
contoh:
std::vector<A> data;
[...]
// calculate the index that should be used;
size_t i = calc_index(param1, param2);
// doing calculations close to the underflow of an integer is already dangerous
// do some bounds checking
if( i - 1 < 0 ) {
// always false, because 0-1 on unsigned creates an underflow
return LEFT_BORDER;
} else if( i >= data.size() - 1 ) {
// if i already had an underflow, this becomes true
return RIGHT_BORDER;
}
// now you have a bug that is very hard to track, because you never
// get an exception or anything anymore, to detect that you actually
// return the false border case.
return calc_something(data[i-1], data[i], data[i+1]);
Setara yang ditandatangani size_t
adalah ptrdiff_t
, bukan int
. Tetapi menggunakan int
masih jauh lebih baik dalam banyak kasus daripada size_t. ptrdiff_t
adalah long
pada 32 dan 64 bit sistem.
Ini berarti bahwa Anda selalu harus mengonversi ke dan dari size_t setiap kali Anda berinteraksi dengan std :: wadah, yang tidak terlalu indah. Tetapi pada konferensi asli yang sedang berjalan para penulis c ++ menyebutkan bahwa merancang std :: vector dengan size_t yang tidak ditandatangani adalah kesalahan.
Jika kompiler memberi Anda peringatan tentang konversi implisit dari ptrdiff_t ke size_t, Anda bisa membuatnya eksplisit dengan sintaks konstruktor:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
jika hanya ingin mengulang koleksi, tanpa batas cheking, gunakan rentang berdasarkan untuk:
for(const auto& d : data) {
[...]
}
di sini beberapa kata dari Bjarne Stroustrup (penulis C ++) akan asli
Bagi sebagian orang, kesalahan desain yang ditandatangani / tidak ditandatangani di STL ini adalah alasan yang cukup, untuk tidak menggunakan std :: vector, melainkan implementasi sendiri.
size_t
saat Anda dapat menyebabkan bug keamanan .