9

以下のコードを使用すると、範囲外の例外が発生しないのはなぜですか?

std::vector<int> v;
v.resize(12);
int t;
try {
    t = v[12];
} catch(std::exception  e){
    std::cout<<"error:"<<e.what()<<"\n";
}
4

2 に答える 2

18

あなたを使うことによって、operator[]あなたは本質的にコンパイラに「私は私が何をしているのか知っています。私を信じてください」と言っています。配列の外側にある要素にアクセスする場合、それはあなたの責任です。あなたはその信頼に違反しました。あなたは自分が何をしているのか知りませんでした。

別の方法は、この方法を使用するat()ことです。ここでは、アクセスに対して健全性チェックを実行するようコンパイラーに要求しています。それらが範囲外の場合は、例外が発生します。

この健全性チェックは、特に深くネストされたループで実行される場合、コストがかかる可能性があります。インデックスが常に範囲内にあることがわかっている場合、これらの健全性チェックの理由はありません。これらの健全性チェックを行わないインターフェースがあると便利です。

operator[]チェックを実行しないものにする理由は、これが[]生の配列とポインターに対して正確に機能するためです。C / C ++には、生の配列/ポインターにアクセスするための健全性チェックはありません。それが必要かどうかをチェックするのはあなたの負担です。

于 2012-10-15T13:44:39.260 に答える
7

operator[]例外をスローしません。at()その振る舞いのために関数を使用してください。

于 2012-10-15T13:37:38.567 に答える