Visual Studio 2008 を使用しています。
std::vector には at() 関数による境界チェックがあり、演算子 [] を誤って (範囲外で) 使用して何かにアクセスしようとすると、未定義の動作になることを認識しています。
境界チェックを使用してプログラムをコンパイルできるかどうか興味があります。このように operator[] は at() 関数を使用し、何かが範囲外になるたびに std::out_of_range をスローします。
release モードは operator[] の境界チェックなしでコンパイルされるため、パフォーマンスは低下しません。
Borland C++ を使用して作成されたアプリを Visual Studio に移行しているため、これについて考え始めました。これはコードのごく一部です (i=0、j=1):
v[i][j]; //v is a std::vector<std::vector<int> >
ベクトル 'v' のサイズは [0][1] です (したがって、ベクトルの要素 0 には要素が 1 つしかありません)。これは未定義の動作ですが、Borland はここで 0 を返し、VS はクラッシュしています。私は 0 を返すよりもクラッシュの方が好きなので、std::out_of_range 例外がスローされることでより多くの「クラッシュ」を取得できれば、移行はより速く完了します (したがって、Borland が隠していたより多くのバグが明らかになります)。