、およびメンバー関数が として指定されていないstd::vectorのはなぜですか?operator[]frontbacknoexcept
3 に答える
標準のポリシーは、失敗できない、または失敗してはならないnoexcept関数のみをマークすることであり、単に例外をスローしないように指定されている関数はマークしません。つまり、制限されたドメインを持つすべての関数 (間違った引数を渡すと未定義の動作が発生する) は、スローするように指定されていない場合でも、そうではありません。noexcept
マークされる関数は、swap(例外の安全性がそれに依存することが多いため、失敗してはならない) やnumeric_limits::min(失敗できない、プリミティブ型の定数を返す) のようなものです。
その理由は、実装者が、テスト フレームワークがエラーを簡単に検出できるように、さまざまな未定義の動作状況をスローするライブラリの特別なデバッグ バージョンを提供することを希望する場合があるためです。たとえば、空のベクトルに対して、またはvector::operator[]を呼び出して範囲外のインデックスを使用する場合。一部の実装では、そこで例外をスローしたいと考えています (これは許可されています: 未定義の動作であるため、何でも実行できます) が、これらの関数の標準で義務付けられているため、これが不可能になっています。frontbacknoexcept
要するに、指定された関数と指定されていない関数がありますnoexcept。それらは異なるため、意図されています。原則として: 未定義の動作が指定された関数 (たとえば、不適切な引数によるもの) を と一緒にすべきではありませんnoexcept。
この論文では、これらのメンバーが存在しないことを明示的に指定しnoexceptました。の一部のメンバーがvector例として使用されました。
広いコントラクトを持つ関数の例は
vector<T>::begin()とvector<T>::at(size_type)です。ワイド コントラクトを持たない関数の例は、vector<T>::front()andvector<T>::operator[](size_type)です。
最初の動機と詳細な議論については、この論文を参照してください。ここで最も明らかな現実的な問題は、テスト容易性です。