câu trả lời ngắn:
hầu như không bao giờ
câu trả lời dài:
Bất cứ khi nào bạn cần phải có một vectơ char lớn hơn 2gb trên hệ thống 32 bit. Trong mọi trường hợp sử dụng khác, sử dụng loại đã ký sẽ an toàn hơn nhiều so với sử dụng loại không dấu.
thí dụ:
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]);
Chữ ký tương đương size_t
là ptrdiff_t
, không int
. Nhưng sử dụng int
vẫn tốt hơn nhiều trong hầu hết các trường hợp so với size_t. ptrdiff_t
Làlong
trên hệ thống 32 và 64 bit.
Điều này có nghĩa là bạn luôn phải chuyển đổi sang và từ size_t bất cứ khi nào bạn tương tác với một std :: container, không đẹp lắm. Nhưng trong một hội nghị bản địa đang diễn ra, các tác giả của c ++ đã đề cập rằng thiết kế std :: vector với size_t không dấu là một sai lầm.
Nếu trình biên dịch của bạn cung cấp cho bạn các cảnh báo về chuyển đổi ngầm định từ ptrdiff_t sang size_t, bạn có thể làm cho nó rõ ràng bằng cú pháp của hàm tạo:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
nếu chỉ muốn lặp lại một bộ sưu tập, không có giới hạn, hãy sử dụng phạm vi dựa trên:
for(const auto& d : data) {
[...]
}
ở đây một số từ của Bjarne Stroustrup (tác giả C ++) tại bản địa
Đối với một số người, lỗi thiết kế đã ký / không dấu này trong STL là đủ lý do, để không sử dụng std :: vector, mà thay vào đó là một triển khai riêng.
size_t
khi nào bạn có thể dẫn đến lỗi bảo mật .