Russian Qt Forum
Май 07, 2024, 07:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Зачем в данном коде виртуальный диструктор и throw()?  (Прочитано 11028 раз)
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #15 : Май 20, 2014, 14:43 »

http://stackoverflow.com/questions/18416780/overrriding-destructor-of-stdexception
Записан
OKTA
Гость
« Ответ #16 : Май 20, 2014, 14:58 »

деструктор в std::string я думаю генерирует исключения.
Дело не в том, генерирует или не генерирует  он исключения, а в том, что он (деструктор std::string) объявлен без throw(), в то время как деструктор LogicError однозначно исключения кидать не должен (семантика деструктора наследника должна совпадать с семантикой родителя). 
Можете проверить это, заменив string на свой пользовательский тип с пустым деструктором, который точно ничего не кидает, но без throw().. Будет таже самая ситуация, что и со string.
 

Ну это я и хотел сказать, что деструктор std::string может генерировать любые исключения в то время, как деструктор в примере вообще не должен их генерировать..
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #17 : Май 20, 2014, 15:07 »

Скажем так, деструктор string не может генерировать исключения, но это не декларированно явно, как у exception. Улыбающийся
Поэтому, компилятор страхуется.
Записан
OKTA
Гость
« Ответ #18 : Май 20, 2014, 15:58 »

Да, откопал про исключения string)
А если он никогда не генерирует исключения, почему тогда явно это не указано? Какой философский смысл?  Непонимающий
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #19 : Май 21, 2014, 00:39 »

Да, откопал про исключения string)
А если он никогда не генерирует исключения, почему тогда явно это не указано? Какой философский смысл?  Непонимающий

Да вообще нельзя кидать исключения в диструкторе. Это насмерть положит весь процесс.

Другое дело, что в бородатые времена для функций просто не было спецификатора, который гарантировал бы, что из этой функции не вылетит исключение.

Нынче - стандартную библиотеку допиливают под новый стандарт.
Если что-то ещё не допилили, то либо просто не успели. Либо - легаси.


Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.