С++ 11 Исключительный деструктор позволяет бросить сейчас? - программирование

С++ 11 Исключительный деструктор позволяет бросить сейчас?

любая идея, почему virtual ~ exception() throw() находится в С++ 98, но virtual ~ exception() находится в С++ 11?

Какое дизайнерское решение разрешает С++ 11 бросать деструктор класса exception?

Из здесь:

С++ 98:

class exception {
public:
  exception () throw();
  exception (const exception&) throw();
  exception& operator= (const exception&) throw();
  virtual ~exception() throw();
  virtual const char* what() const throw();
}

С++ 11:

class exception {
public:
  exception () noexcept;
  exception (const exception&) noexcept;
  exception& operator= (const exception&) noexcept;
  virtual ~exception();
  virtual const char* what() const noexcept;
}
4b9b3361

Ответ 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:

Использование спецификаций динамических исключений устарело.