Косвенная рекурсия, зависимые статические переменные

Является ли результат следующей косвенной рекурсии определенным стандартом или это неопределенное поведение?

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 но я не уверен, что это гарантировано стандартом.

6

Решение

Это неопределенное поведение.

[Statement.decl] / 4

Если во время инициализации переменной элемент управления повторно вводит объявление, поведение не определено. [Пример:

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

конец примера ]

10

Другие решения

Это не должно привести к чему-либо полезному от любого компилятора. Это бесконечная рекурсия, которая, вероятно, приведет к ошибке сегментации или кучи переполнения стека (в зависимости от системы), даже если вы исправите неопределенное поведение попытки рекурсивно установить значение статической переменной:

auto abc() -> int;

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

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

int main()
{
int tmp = xyz(); // defined behavior, but infinite recursion
}
2

По вопросам рекламы [email protected]