คำตอบสั้น ๆ :
แทบจะไม่เคย
คำตอบยาว:
เมื่อใดก็ตามที่คุณต้องมีเวกเตอร์ของถ่านที่ใหญ่กว่านั้น 2gb ในระบบ 32 บิต ในทุกกรณีการใช้งานการใช้ประเภทที่เซ็นชื่อนั้นปลอดภัยกว่าการใช้ประเภทที่ไม่ได้ลงนาม
ตัวอย่าง:
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]);
ลงนามเทียบเท่าsize_t
เป็นไม่ได้ptrdiff_t
int
แต่int
ในกรณีส่วนใหญ่ยังใช้งานได้ดีกว่า size_t ptrdiff_t
คือlong
ในระบบ 32 และ 64 บิต
ซึ่งหมายความว่าคุณต้องแปลงเป็นและจาก size_t ทุกครั้งที่คุณโต้ตอบกับ std :: container ซึ่งไม่สวยงามมาก แต่ในการประชุมที่กำลังจะเกิดขึ้นผู้เขียน c ++ กล่าวว่าการออกแบบ std :: vector ด้วยขนาดที่ไม่ได้ลงนามนั้นเป็นความผิดพลาด
หากคอมไพเลอร์ของคุณให้คำเตือนเกี่ยวกับการแปลงโดยนัยจาก ptrdiff_t เป็น size_t คุณสามารถทำให้ชัดเจนด้วยไวยากรณ์ตัวสร้าง:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
ถ้าเพียงแค่ต้องการย้ำคอลเลคชั่นโดยไม่มีการ จำกัด ขอบเขตให้ใช้ช่วงสำหรับ:
for(const auto& d : data) {
[...]
}
ต่อไปนี้เป็นคำบางคำจาก Bjarne Stroustrup (ผู้เขียน C ++) ที่เป็นเจ้าของภาษา
สำหรับบางคนข้อผิดพลาดในการออกแบบที่ลงชื่อ / ไม่ได้ลงชื่อใน STL นั้นมีเหตุผลเพียงพอที่จะไม่ใช้ std :: vector แต่เป็นการใช้งานของตัวเองแทน
size_t
เมื่อคุณควรจะนำไปสู่ข้อบกพร่องการรักษาความปลอดภัย