短い答え:
ほとんどは決してない
長い答え:
32ビットシステムで2GBよりも大きいcharのベクトルが必要な場合はいつでも。他のすべてのユースケースでは、符号付き型を使用する方が、符号なし型を使用するよりもはるかに安全です。
例:
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よりも使用する方がはるかに優れています。32ビットおよび64ビットシステム上にありますptrdiff_t
。long
つまり、std :: containerを操作するときは常に、size_tとの間で変換する必要がありますが、これはあまり美しくありません。しかし、進行中のネイティブ会議で、c ++の作成者は、符号なしのsize_tを使用して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) {
[...]
}
ここにネイティブになるときのBjarneStroustrup(C ++作者)からのいくつかの言葉
一部の人々にとって、STLのこの符号付き/符号なしの設計エラーは、std :: vectorを使用せず、代わりに独自の実装を使用するのに十分な理由です。