Конструктор статического объекта в функциональной области выдает исключение - PullRequest
8 голосов
/ 08 августа 2011

Рассмотрим следующий код:

#include <iostream>

struct X{
   X(){
      throw 0;
   }
};

void f(){
   static X x;
}

int main(){
   try {
      f();
   }
   catch(int)   {
      std::cout << "Caught first time" << std::endl;
   }
   try {
      f();
   }
   catch(int) {
      std::cout << "Caught second time" << std::endl;
   }
}

Вывод этой программы:

Поймано в первый раз
Поймано во второй раз

Итак, гарантируется ли стандартом, что конструктор статического объекта будет вызываться снова и снова, пока он не будет успешно завершен?Я не могу найти место в стандарте, где оно упоминается, поэтому очень приветствуются цитата или ссылка на главу и стих.

Или в моем примере присутствует какое-то неопределенное поведение?

1 Ответ

14 голосов
/ 08 августа 2011

Гарантируется, что строительство будет предприниматься до тех пор, пока оно не удастся.

Это вызвано тем, что указано в C ++ 03 §6.7 / 4:

... В противном случае такой объект инициализируется при первом прохождении контроля через его объявление; такой объект считается инициализированным по завершении его инициализации. Если инициализация завершается с выдачей исключения, инициализация не завершена, поэтому она будет повторена при следующем входе элемента управления в объявление. Если элемент управления повторно входит в объявление (рекурсивно) во время инициализации объекта, поведение не определено. [Пример:

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

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

Замечу, что gcc выдает исключение в случае попытки рекурсивной инициализации, см. связанный вопрос litb относительно моего источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...