kurze Antwort:
fast nie
lange Antwort:
Wann immer Sie einen Zeichenvektor benötigen, der größer als 2 GB auf einem 32-Bit-System ist. In jedem anderen Anwendungsfall ist die Verwendung eines signierten Typs viel sicherer als die Verwendung eines nicht signierten Typs.
Beispiel:
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]);
Das signierte Äquivalent von size_t
ist ptrdiff_t
nicht int
. int
In den meisten Fällen ist die Verwendung jedoch immer noch viel besser als size_t. ptrdiff_t
ist long
auf 32- und 64-Bit-Systemen.
Dies bedeutet, dass Sie immer zu und von size_t konvertieren müssen, wenn Sie mit einem std :: -Container interagieren, der nicht sehr schön ist. Auf einer laufenden nativen Konferenz erwähnten die Autoren von c ++ jedoch, dass das Entwerfen von std :: vector mit einer vorzeichenlosen Größe_t ein Fehler war.
Wenn Ihr Compiler Sie bei impliziten Konvertierungen von ptrdiff_t nach size_t warnt, können Sie dies mit der Konstruktorsyntax explizit machen:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
Wenn Sie nur eine Sammlung iterieren möchten, ohne Grenzen zu überschreiten, verwenden Sie den Bereich basierend auf:
for(const auto& d : data) {
[...]
}
Hier einige Worte von Bjarne Stroustrup (C ++ - Autor), wie man einheimisch wird
Für einige Leute ist dieser signierte / nicht signierte Designfehler in der STL Grund genug, nicht den std :: vector zu verwenden, sondern eine eigene Implementierung.
size_t
wenn Sie führen können , sollten Sicherheitslücken .