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