Я знаю, что эта функция будет объявлена устаревшей в C++0x, но для меня, как для новичка, она кажется хорошей идеей. Может ли кто-нибудь объяснить мне, почему это не очень хорошая идея?
Спецификация исключения
Ответы (3)
Пожалуйста, ознакомьтесь с подробной статьей Херба Саттера. У него есть самое подробное объяснение проблем и недостатков их дизайна.
Прагматичный взгляд на спецификации исключений
std::unexpected
было бы довольно значительным изменением в существующем коде ... Я не могу представить, что многие члены комитета были бы рады сделать четко определенное поведение неопределенным.
- person Dennis Zickefoose; 03.11.2011
std::unexpected
. (И вам на самом деле не нужно делать это неопределенным поведением, поскольку современные компиляторы реализуют попытку/поймать с нулевым прослушиванием... Смысл в том, чтобы позволить компилятору предположить, что спецификация throw
говорит правду, чтобы разрешить более оптимальный код. Жалоба Херба то, что это не так, является недостатком MSVC и/или спецификации, а не фундаментальной проблемой.)
- person Nemo; 03.11.2011
Насколько я понимаю, спецификация исключения означает:
Я не хочу, чтобы вы (компилятор) генерировали дополнительный код, который гарантирует, что исключение относится к одному из этих типов. Если не прекратите, пожалуйста, мы тост. Дополнительная проверка должна быть помещена в (неявный) обработчик исключений (необходимый для его реализации) при каждом вызове.
Обзор http://www.gotw.ca/publications/mill22.htm
Выпуск первый: «Система теневых типов»
Правда, мелкий технический момент, и легко поправимый.
Вопрос второй: (не)понимание
Вот что, по мнению многих людей, делают спецификации исключений:
Его первый пункт:
- Гарантия того, что функции будут генерировать только перечисленные исключения (возможно, ни одного).
Если это то, что люди думают, это очень хорошо, потому что это именно то, что гарантирует 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) Принудительно во время выполнения функции будут генерировать только перечисленные исключения (возможно, ни одного)», также опровергает этот «аргумент».
Оба основных пункта Херба очевидно, абсолютно, бесспорно неверны, по его мнению.
Что еще я могу добавить?
Я считаю, что слова имеют фиксированное значение, которое нельзя изменить по желанию, ради «аргумента».
Both of Herb's 2 main points are obviously, absolutely, indisputably wrong.
. Что ж, давайте просто предположим, что для меня это не так очевидно, как для вас. Потрудитесь объяснить, что именно так очевидно?
- person Xeo; 26.11.2011