Является ли результат следующей косвенной рекурсии определенным стандартом или это неопределенное поведение?
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 но я не уверен, что это гарантировано стандартом.
Это неопределенное поведение.
[Statement.decl] / 4Если во время инициализации переменной элемент управления повторно вводит объявление, поведение не определено. [Пример:
int foo(int i) { static int s = foo(2*i); // recursive call - undefined return i+1; }
— конец примера ]
Это не должно привести к чему-либо полезному от любого компилятора. Это бесконечная рекурсия, которая, вероятно, приведет к ошибке сегментации или кучи переполнения стека (в зависимости от системы), даже если вы исправите неопределенное поведение попытки рекурсивно установить значение статической переменной:
auto abc() -> int;
auto xyz() -> int
{
return abc();
}
auto abc() -> int
{
return xyz();
}
int main()
{
int tmp = xyz(); // defined behavior, but infinite recursion
}