Что происходит, когда конструктор статической переменной в функции завершается необычным образом?

У меня есть функция, которую можно свести к следующему:

void f() {
    static MyObject o("hello");

    DoSomethingWith(o);
}

Эта функция вызывается через границу C API поэтому, как хороший мальчик, я использую try , чтобы перехватывать любые исключения, которые генерируются до того, как они пересекают границу и облажаются:

void f() {
    try {
        static MyObject o("hello");

        DoSomethingWith(o);
    } catch (const MyObjectException& e) {
        Message("Constructor of o failed");
    }
}

Эта функция вызывается в первый раз, и я получаю сообщение "Конструктор o не удалось" . Однако позже функция вызывается снова, и я снова получаю сообщение. Я получаю сообщение столько раз, сколько вызывается f . Я использую Visual C ++, поэтому это говорит мне о том, что делает MSVC ++, но не о том, что следует делать.

Мой вопрос: что должно произойти, когда конструктор static функциональной переменной завершается необычным образом (из-за throw ing, a longjmp из конструктора, завершение потока, в котором он находится, и т. д.)? Также что должно произойти с любыми другими статическими переменными, объявленными до и после него? Я также был бы признателен за любые соответствующие цитаты из стандарта.

5
задан Seth Carnegie 29 January 2012 в 23:07
поделиться