Ответ 1
Что такое решение, позволяющее С++ 11 разрешить бросать деструктор класса
exception
?
Не было такого дизайнерского решения (к счастью!). В С++ 11 по умолчанию даже явно объявленные деструкторы квалифицируются как noexcept
. Это можно сделать из параграфа 12.4/3 стандарта С++ 11:
Объявление деструктора, не имеющего спецификации исключения, неявно считается та же спецификация исключения, что и неявное объявление (15.4).
И из пункта 15.4/14, в котором указывается, какая спецификация исключения имеет неявное объявление:
Наследующий конструктор (12.9) и неявно объявленная специальная функция-член (раздел 12) имеют Исключение-спецификации. Если
f
- наследующий конструктор или конструктор по умолчанию неявно объявленный, скопируйте конструктор, конструктор перемещения, деструктор, оператор присваивания копий или оператор переадресации, его неявный exception-specification указывает идентификатор типаT
тогда и только тогда, когдаT
допускается спецификацией исключения функции, непосредственно вызываемой fs неявным определением;f
разрешает все исключения, если какая-либо функция напрямую invokes допускает все исключения, аf
имеет спецификацию исключенияnoexcept(true)
, если каждая функция напрямую invokes не допускает исключений.
Вместе эти два абзаца гарантируют (с учетом объявления, которое вы указали для деструктора exception
), которое деструктор exception
не будет выбрасывать.
Это также явно указано в параграфах 18.8.1/7-8 Стандарта С++ 11:
virtual ~exception();
7 Эффекты: уничтожает объект исключения класса.
8 Замечания: Не исключает никаких исключений.
Обратите внимание, что динамические спецификации исключений (например, throw()
) устарели в С++ 11. В § D.4/1 Приложения D:
Использование спецификаций динамических исключений устарело.