標準ライブラリは、テンプレート型の要件を破ったり、誤った関数引数を与えたり、その他の契約違反を行ったりした場合、習慣的に未定義の動作を許可します。ユーザーライブラリでこれを許可することは良い習慣と考えられていますか? そうするのが公正なのはいつですか?
operator[]
コンテナーの を作成することを検討してください。
template <typename t>
T& container<T>::operator[](int i)
{
return internal_array[i];
}
i
の境界外のインデックスの場合internal_array
、未定義の動作にヒットします。これが発生することを許可する必要がありますか、それとも境界チェックを行って例外をスローする必要がありますか?
もう 1 つの例は、int
引数を取りますが、制限されたドメインのみを許可する関数です。
int foo(int x)
{
if (x > 0 && x <= 10) {
return x;
}
}
x
ドメイン内にない場合、実行はreturn
ステートメントなしで関数の最後に到達します。これにより、未定義の動作が発生します。
ライブラリ開発者は、これを許可するかどうかを気の毒に思うべきでしょうか?