2

::fgetpos を呼び出すコードがあり、キャッチできないカーネル例外が発生します (私の VS 2008 プロジェクトにはオプション /ehs があります)。しかし、標準ライブラリ ルーチンがこの種の例外をスローする べきではないと思わずにはいられません。

update : ::fgetpos(0, &foo) を呼び出してみましたが、これは明らかに間違っていて、実際にカーネル レベルの例外を受け取りました。私は困惑しています。C++ 標準ライブラリが最も基本的な引数チェック (null ポインターのチェック) を実行せず、std::invalid_argument を発生させないのはなぜですか?

そのような基本的なチェックを実行する標準ライブラリルーチンはありますか?それとも、それらはすべて喜んでプログラムを終了させますか?

4

1 に答える 1

1

C++ 標準ライブラリが最も基本的な引数チェック (null ポインターのチェック) を実行しないのはなぜですか?

チェックが必要な場合は、自分で行うことができるからです。C++ の哲学は、必要のないものにはお金を払わないということです。私が賢明なプログラマーであり、関数に無効な引数を渡さないのであれば、不要なチェックによってプログラムのパフォーマンスが低下する可能性があるのはなぜでしょうか?

これがstd::vector、たとえば が との両方operator[]を提供する理由ですat()。後者は境界チェックを実行し、前者は実行しません。チェックが必要な場合は、追加してください。

于 2011-02-19T21:11:58.830 に答える