21

私がいくつかのc++コードを持っているとしましょう:

if (error)
    goto exit;
... 
// size_t i = 0; //error
size_t i;
i = 0;
...
exit:
    ...

使用すべきではないことは理解していますgotoが、それでもなぜ使用するのですか

size_t i;
i = 0;

コンパイルsize_t i = 0;しませんか?

なぜそのような振る舞いが標準(@SingerOfTheFallによって言及されている)によって強制されるのですか?

4

2 に答える 2

17

オブジェクトの初期化を飛び越えることはできません。

size_t i = 0; 

は初期化ですが、

size_t i;
i = 0;

ではありません。

C++ 標準は次のように述べています。

ブロックに転送することは可能ですが、初期化で宣言をバイパスする方法ではできません。自動保存期間を持つローカル変数がスコープ内にないポイントからスコープ内にあるポイントにジャンプするプログラムは、変数が POD 型 (3.9) を持ち、初期化子なしで宣言されていない限り、形式が正しくありません。

于 2012-07-03T08:11:19.430 に答える
0

このルールの理由は、初期化を飛び越えると、オブジェクトが未定義の状態のままになるためです。関数の最後に到達すると、これらの初期化されていないオブジェクトを破棄しても機能しない場合があります。

1つの例外は明らかに

int   i;

とにかく未初期化のままintなので、スキップするのは半分悪いだけです。

機能を早期に終了したい場合は、クイックreturnを回避するためのオプションgotoです。

于 2012-07-03T08:25:34.157 に答える