他の答えには実世界の例がないため、1つ追加します。私が(個人的に)符号なしの型を避けようとする理由の1つ。
標準のsize_tを配列インデックスとして使用することを検討してください。
for (size_t i = 0; i < n; ++i)
// do something here;
わかりました、完全に普通。次に、何らかの理由でループの方向を変更することにしたことを検討してください。
for (size_t i = n - 1; i >= 0; --i)
// do something here;
そして今では機能しません。int
イテレータとして使用した場合、問題はありません。過去2年間でこのようなエラーが2回発生しました。実稼働環境で発生し、デバッグが困難でした。
私のもう1つの理由は、毎回このようなことを書くようにする迷惑な警告です:
int n = 123; // for some reason n is signed
...
for (size_t i = 0; i < size_t(n); ++i)
これらはマイナーなものですが、それらは合計します。どこでも符号付き整数のみが使用されている場合、コードはよりクリーンであると感じます。
編集:
確かに、例は馬鹿げているように見えますが、私は人々がこの間違いを犯しているのを見ました。それを避ける簡単な方法があれば、それを使ってみませんか?
VS2015またはGCCで次のコードをコンパイルすると、デフォルトの警告設定で警告が表示されません(GCCの-Wallを使用しても)。GCCでこれに関する警告を得るには、-Wextraを要求する必要があります。これは、常にWallとWextraでコンパイルする必要がある理由の1つです(そして静的アナライザーを使用します)が、多くの実際のプロジェクトではそうしません。
#include <vector>
#include <iostream>
void unsignedTest()
{
std::vector<int> v{ 1, 2 };
for (int i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
for (size_t i = v.size() - 1; i >= 0; --i)
std::cout << v[i] << std::endl;
}
int main()
{
unsignedTest();
return 0;
}