réponse courte:
presque jamais
longue réponse:
Chaque fois que vous avez besoin d'un vecteur de caractères supérieur à 2 Go sur un système 32 bits. Dans tous les autres cas d'utilisation, l'utilisation d'un type signé est beaucoup plus sûre que l'utilisation d'un type non signé.
exemple:
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]);
L'équivalent signé de size_t
est ptrdiff_t
, non int
. Mais l'utilisation int
est toujours bien meilleure dans la plupart des cas que size_t. ptrdiff_t
estlong
sur les systèmes 32 et 64 bits.
Cela signifie que vous devez toujours convertir vers et depuis size_t chaque fois que vous interagissez avec un conteneur std ::, ce qui n'est pas très beau. Mais lors d'une conférence native en cours, les auteurs de c ++ ont mentionné que la conception de std :: vector avec un size_t non signé était une erreur.
Si votre compilateur vous donne des avertissements sur les conversions implicites de ptrdiff_t à size_t, vous pouvez le rendre explicite avec la syntaxe du constructeur:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
si vous voulez simplement itérer une collection, sans limites, utilisez la plage basée sur:
for(const auto& d : data) {
[...]
}
voici quelques mots de Bjarne Stroustrup (auteur C ++) à devenir natif
Pour certaines personnes, cette erreur de conception signée / non signée dans la STL est une raison suffisante pour ne pas utiliser le vecteur std ::, mais plutôt une implémentation propre.
size_t
quand vous le devriez peut entraîner des bogues de sécurité .