以下のコードを使用すると、範囲外の例外が発生しないのはなぜですか?
std::vector<int> v;
v.resize(12);
int t;
try {
t = v[12];
} catch(std::exception e){
std::cout<<"error:"<<e.what()<<"\n";
}
あなたを使うことによって、operator[]
あなたは本質的にコンパイラに「私は私が何をしているのか知っています。私を信じてください」と言っています。配列の外側にある要素にアクセスする場合、それはあなたの責任です。あなたはその信頼に違反しました。あなたは自分が何をしているのか知りませんでした。
別の方法は、この方法を使用するat()
ことです。ここでは、アクセスに対して健全性チェックを実行するようコンパイラーに要求しています。それらが範囲外の場合は、例外が発生します。
この健全性チェックは、特に深くネストされたループで実行される場合、コストがかかる可能性があります。インデックスが常に範囲内にあることがわかっている場合、これらの健全性チェックの理由はありません。これらの健全性チェックを行わないインターフェースがあると便利です。
operator[]
チェックを実行しないものにする理由は、これが[]
生の配列とポインターに対して正確に機能するためです。C / C ++には、生の配列/ポインターにアクセスするための健全性チェックはありません。それが必要かどうかをチェックするのはあなたの負担です。
operator[]
例外をスローしません。at()
その振る舞いのために関数を使用してください。