Сначала вызывается дескриптор
q
, потому что он уничтожается как первая часть разматывания стека (сначала уничтожаются локальные объекты во внутренней области видимости), затем вызывается деструктор b
, также как частьстек раскручивается.Оба уничтожаются еще до того, как блок захвата будет введен.Разматывание стека происходит перед выполнением обработчика исключений.
Имейте в виду, однако, что объекты исключений копируются, поэтому в B::g()
копии (объекте исключения) q
, который является копией b
создан, и его время жизни продолжается до конца блока catch.Он используется для инициализации (нарезки!) e
.
Деструктор для самого объекта исключения (копия q
) выполняется сразу после уничтожения e
(так как обработчик этого не делаетвыход через throw;
).Этот порядок указан в стандарте.