Search code examples
c++c++11recursionstatic-initialization

Indirect recursion, dependent static variables


Is the result of the following indirect recursion defined by the standard or is it undefined behavior?

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();
}

In VS2012 tmp is 5 but I'm not sure if that's guaranteed by the standard.


Solution

  • It's undefined behaviour.

    [statement.decl]/4

    If control re-enters the declaration recursively while the variable is being initialized, the behavior is undefined. [Example:

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

    end example ]