6

次の間接再帰の結果は標準で定義されていますか、それとも未定義の動作ですか?

auto abc() -> int ;

auto xyz() -> int  {
    static int instance = 3 + abc();
    return instance;
}

auto abc() -> int {
    static int instance = 2 + xyz();
    return instance;
}

int main() {
    int tmp = xyz();//or abc();
}

VS2012 ではtmp は 5ですが、それが標準で保証されているかどうかはわかりません。

4

2 に答える 2

10

未定義の動作です。

[ステートメント.decl]/4

変数の初期化中に制御が宣言に再帰的に入る場合、動作は未定義です。【例:

int foo(int i) {
    static int s = foo(2*i); // recursive call - undefined
    return i+1;
}

終了例]

于 2013-10-25T21:03:30.987 に答える
2

これは、どのコンパイラからも有用なものにはなりません。これは無限再帰であり、静的変数の値を再帰的に設定しようとする未定義の動作を修正したとしても、(システムによっては) セグメンテーション違反またはスタック オーバーラン ヒープ エラーが発生する可能性があります。

auto abc() -> int;

auto xyz() -> int  
{
    return abc();
}

auto abc() -> int 
{
    return xyz();
}

int main() 
{
    int tmp = xyz(); // defined behavior, but infinite recursion
}
于 2013-10-25T21:05:45.347 に答える