49

、およびメンバー関数が として指定されていないstd::vectorのはなぜですか?operator[]frontbacknoexcept

4

3 に答える 3

73

標準のポリシーは、失敗できない、または失敗してはならないnoexcept関数のみをマークすることであり、単に例外をスローしないように指定されている関数はマークしません。つまり、制限されたドメインを持つすべての関数 (間違った引数を渡すと未定義の動作が発生する) は、スローするように指定されていない場合でも、そうではありません。noexcept

マークされる関数は、swap(例外の安全性がそれに依存することが多いため、失敗してはならない) やnumeric_limits::min(失敗できない、プリミティブ型の定数を返す) のようなものです。

その理由は、実装者が、テスト フレームワークがエラーを簡単に検出できるように、さまざまな未定義の動作状況をスローするライブラリの特別なデバッグ バージョンを提供することを希望する場合があるためです。たとえば、空のベクトルに対して、またはvector::operator[]を呼び出して範囲外のインデックスを使用する場合。一部の実装では、そこで例外をスローしたいと考えています (これは許可されています: 未定義の動作であるため、何でも実行できます) が、これらの関数の標準で義務付けられているため、これが不可能になっています。frontbacknoexcept

于 2013-12-11T10:59:43.643 に答える
5

要するに、指定された関数と指定されていない関数がありますnoexcept。それらは異なるため、意図されています。原則として: 未定義の動作が指定された関数 (たとえば、不適切な引数によるもの) を と一緒にすべきではありませんnoexcept

この論文では、これらのメンバーが存在しないことを明示的に指定しnoexceptました。の一部のメンバーがvector例として使用されました。

広いコントラクトを持つ関数の例はvector<T>::begin()vector<T>::at(size_type)です。ワイド コントラクトを持たない関数の例は、vector<T>::front()andvector<T>::operator[](size_type)です。

最初の動機と詳細な議論については、この論文を参照してください。ここで最も明らかな現実的な問題は、テスト容易性です。

于 2014-10-13T00:47:09.357 に答える