Ответ 1
См. эту подробную статью Херба Саттера. У него есть наиболее полное объяснение проблем и коротких событий их дизайна.
Прагматический взгляд на ограничения исключений
Я знаю, что эта функция будет устаревать в С++ 0x, но для меня, как для всего новичков, кажется, что это хорошая идея. Может ли кто-нибудь объяснить мне, почему это не очень хорошая идея?
См. эту подробную статью Херба Саттера. У него есть наиболее полное объяснение проблем и коротких событий их дизайна.
Прагматический взгляд на ограничения исключений
Насколько я понимаю, спецификация исключения означает:
Я не хочу (компилятор) генерировать дополнительный код, который гарантирует, что исключение является одним из этих типов. Если мы не позвоним, пожалуйста, мы тосты. Дополнительная проверка должна быть помещена в (неявный) обработчик исключений (требуется для его реализации) в каждом вызове.
Обзор http://www.gotw.ca/publications/mill22.htm
Выпуск первого: "Система теневого типа"
Правда, незначительная техническая точка и легко исправить.
Вывести второе: (Mis) понимания
Вот, что многие думают, что спецификации исключений:
Его первая точка:
- Гарантируйте, что функции будут перебрасывать только перечисленные исключения (возможно, они отсутствуют).
Если это то, что люди думают, это очень хорошо, потому что именно это гарантирует ES по определению. Трава соглашается в том же документе:
(ES) Обеспечьте во время выполнения, что функции будут только бросать перечисленные исключения (возможно, нет).
Его вторая точка:
- Включить оптимизацию компилятора, основанную на знании того, что будут выбраны только перечисленные исключения (возможно, ни один).
Это также абсолютно правильно.
Он объясняет, почему этот второй пункт является неверным убеждением с примером:
// Example 1(b) reprise, and two
// potential white lies:
//
int Gunc() throw(); // will throw nothing (?)
int Hunc() throw(A,B); // can only throw A or B (?)
Правильны ли комментарии? Не совсем. Gunc() может действительно что-то выбросить, а Hunc() может отличить что-то другое, чем A или B! Компилятор просто гарантирует победить их бессмысленно, если они это сделают... ах, и большую часть времени избивать свою программу бессмысленно.
Так как Gunc() или Hunc() действительно могли выбросить то, что они обещали не, не только не могут компилятор предположить, что это не произойдет (...)
Последнее упоминание о том, что "(ES) При выполнении во время выполнения функции будут вызывать только перечисленные исключения (возможно, нет)." также опровергают этот "аргумент".
Оба Herb 2 основных пунктов, очевидно, абсолютно, бесспорно так, в соответствии с ним.
Что еще я могу добавить?
Я считаю, что слова имеют фиксированное значение, которое не может быть изменено по желанию ради "аргумента".