言語の作業中に、フロー制御に関する興味深いシナリオに出くわしました。break
ステートメントの処理中に例外がスローされるとどうなりますか。GCC はブレーク フローが失われたと考えているようですが、標準では何が起こるべきかについては沈黙しているようです。
たとえば、次のプログラムは実際に何をすべきでしょうか?
#include <iostream>
using namespace std;
struct maybe_fail {
bool fail;
~maybe_fail() {
if( fail )
throw 1;
}
};
int main() {
for( int i=0; i < 6; ++i ) {
cout << "Loop: " << i << endl;
try {
maybe_fail mf;
mf.fail = i % 2;
if( i == 3 )
break;
} catch( int ) {
cout << "Caught" << endl;
}
}
return 0;
}
return
aも a と同様にブロックされることに注意してくださいcontinue
(それを確認するには、catch の後に出力を追加します)。ブロックの外への試みgoto
もキャッチされます。
正しい流れとは?標準はこれに対処していないようです。ジャンプステートメントに関するセクション6.6は言及しておらず、例外処理に関するセクション15も言及していません。デストラクタの例外がひどく悪い形であることは理解していますが、遅延ステートメントに BOOST_SCOPE_EXIT のようなものを使用している場合、この動作は非常に重要になる可能性があります。
おそらく興味深いことに、Java と Python で同じフローが発生するため、少なくとも命令型言語にはある程度の一貫性があるようです。