Подтвердить что ты не робот

Исключение происходит дважды

class A{
    public:
        A() { throw string("exception A"); };
};

class B{
    A a;
    public:
        B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; };
};

int main(){    
    try{
        B b;
    }catch(string& s){
        cout << &s << " " << s << endl;
    }
    return 0;
}

Вывод:

0x32c88 exception A
0x32c88 exception A

Поскольку исключение уже было найдено в конструкторе B, почему оно все еще встречается в основной функции?

4b9b3361

Ответ 1

Когда поток contol достигает конца обработчика для функции-try-блока конструктора, исключенное исключение автоматически будет повторно выбрано.

Вы не можете подавить исключение, созданное при построении базового класса или члена в конструкторе производного класса, поскольку это приведет к построенному производному объекту с базой или элементом, который не удалось построить.

Этот GOTW имеет значение: http://www.gotw.ca/gotw/066.htm

Из ISO/IEC 14882: 2011 15.3 [except.handle]/15:

Исключенное в настоящее время исключение возвращается, если элемент управления достигает конца обработчика функции-try-блока конструктора или деструктора. [...]