Коротка відповідь:
майже ніколи
довга відповідь:
Кожен раз, коли вам потрібно мати вектор char, більший за 2 Гб в 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 ::, що не дуже красиво. Але на щоденній конференції, яка відкрилася, автори c ++ відзначили, що проектування std :: vector з неподписаним size_t було помилкою.
Якщо ваш компілятор подає вам попередження про неявні перетворення від 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
коли вам слід, може призвести до помилок у безпеці .