C ++ 11 Деструктор Exception позволяет бросать сейчас?

Любая идея, почему виртуальный ~ exception () throw () в C ++ 98, а виртуальный ~ exception () в C ++ 11?

Какие'Является ли дизайнерское решение, которое позволяет C ++ 11 добавить деструктор класса?exception

ОтВот:

C ++ 98:

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

C ++ 11:

class exception {
public:
  exception () noexcept;
  exception (const exception&) noexcept;
  exception& operator= (const exception&) noexcept;
  virtual ~exception();
  virtual const char* what() const noexcept;
}
 BoBTFish14 мая 2013 г., 13:04
Поменялись скриншотами для кода.
 Mike Seymour14 мая 2013 г., 13:16
@PlasmaHH: Вы заметили отсутствиеnoexcept на деструкторе?
 PlasmaHH14 мая 2013 г., 12:27
Вы заметили ключевое слово noexcept и, возможно, задались вопросом, что это такое?

Ответы на вопрос(1)

Решение Вопроса

s Принимает ли решение, что C ++ 11 позволяет добавить деструктор класса?exception

Не было такого дизайнерского решения (к счастью!). В C ++ 11 даже явно объявленные деструкторы квалифицируются какnoexcept по умолчанию. Это может быть подтверждено в пункте 12.4 / 3 стандарта C ++ 11:

Объявление деструктора, который не имеетИсключение-спецификация неявно считается иметь тот жеИсключение-спецификация как неявное объявление (15.4).

А из параграфа 15.4 / 14, который определяет, какую спецификацию исключений имеет неявное объявление:

Унаследованный конструктор (12.9) и неявно объявленная специальная функция-член (раздел 12) имеют спецификацию исключений. Еслиf является наследующим конструктором илинеявно объявлено конструктор по умолчанию, конструктор копирования, конструктор перемещения,деструкторКопировать оператор присваивания или переместить оператор присваивания, его неявная спецификация исключения определяет идентификатор типаT если и только еслиT допускается спецификацией исключений для функции, непосредственно вызываемой f ’неявное определение;f разрешает все исключения, если любая функция, которую она вызывает напрямую, разрешает все исключения, иf имеет спецификацию исключенияnoexcept(true) если каждая функция, которую она вызывает напрямую, не допускает никаких исключений.

Вместе два вышеупомянутых параграфа гарантируют (учитывая заявление, которое вы процитировалиexceptionдеструктор) это деструкторexception победил'т бросок.

Это также прямо указано в пунктах 18.8.1 / 7-8 стандарта C ++ 11: 7

virtual ~exception();

Последствия: Уничтожает объект класса исключение.

Примечания:Не выбрасывает никаких исключений.

Обратите внимание, что динамические исключения спецификации (такие какthrow()) устарели в C ++ 11. Согласно § D.4 / 1 Приложения D:

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

 Andy Prowl14 мая 2013 г., 12:51
@hongpei: рад, что помог. На самом деле деструкторы - это особый случай, поскольку по умолчанию имеет смысл предположить, что они победили.t throw (если они это сделают, будет высокий риск завершения вашей программы)
 Angew14 мая 2013 г., 12:35
Вы можете добавить цитату дляnoexcept по умолчанию: [кроме.spec] §14. Это точно нет в самом интуитивном месте.
 hong pei14 мая 2013 г., 12:46
Спасибо! это имеет большой смысл, хотя я не люблю "дефолт" вещи вообще!
 Andy Prowl14 мая 2013 г., 12:50
@Angew: Извините за задержку, пришлось уйти на некоторое время. Я отредактировал ответ, спасибо!
 Holt28 апр. 2018 г., 12:19
@AndyProwl Я только что закрыл вопрос как дубликат этого (stackoverflow.com/questions/50025862/...), Сам OP помечает вопрос как дубликат, но в одном из ответов есть хорошая цитата, касающаяся спецификации исключений деструкторов в стандартной библиотеке, что было бы отличным дополнением к этому ответу.

Ваш ответ на вопрос