Ничего особенного не должно произойти. Согласно стандарту C ++:
[stmt.dcl] (выделено мое)
4 Динамическая инициализация переменной области блока со статическим хранилищем
продолжительность или продолжительность хранения потока выполняется в первый раз
контроль проходит через его декларацию; такая переменная считается
инициализируется после завершения его инициализации. Если
инициализация завершается с помощью исключения, инициализация
не завершено, поэтому он будет повторен при следующем входе управления
декларация. Если контроль вводит декларацию одновременно
переменная инициализируется, параллельное выполнение должно ждать
для завершения инициализации. Если контроль снова входит в
объявление рекурсивно во время инициализации переменной,
поведение не определено. [ Пример :
int foo(int i) {
static int s = foo(2*i); // recursive call - undefined
return i+1;
}
- конец примера ]
Утверждение, которое я ободрил, именно то, что происходит в вашей программе. Это также то, что пример стандарта показывает как неопределенный. Спецификация языка говорит, что реализация может делать все, что сочтет целесообразным. Таким образом, это может вызвать бесконечный цикл, а может и нет, в зависимости от примитивов синхронизации, которые ваша реализация использует для предотвращения одновременного повторного входа в блок (инициализация должна быть поточно-безопасной).
Еще до C ++ 11 поведение рекурсивного повторного входа было неопределенным. Реализация может сделать что угодно, чтобы убедиться, что объект инициализируется только один раз, что, в свою очередь, может привести к различным результатам.
Но вы не можете ожидать, что что-то конкретное случится переносимо. Не говоря уже о неопределенном поведении, всегда остается место для небольшого шанса носовых демонов.