Я знаю, что эта функция будет устаревать в C++ 0x, но для меня, как для новичков, кажется, что это хорошая идея. Может ли кто-нибудь объяснить мне, почему это не очень хорошая идея?Спецификация исключения
ответ
См. Эту подробную статью Herb Sutter. У него есть самое подробное объяснение проблем и коротких событий их дизайна.
прагматичный взгляд на Exception Specificiations
«Вот что многие люди считают, что спецификации исключений: - Гарантируйте, что функции будут только бросать перечисленные исключения (возможно, нет) ._« Чистая ерунда. Это точно, что они делают. «_Enable оптимизация компилятора, основанная на знании того, что будут исключены только перечисленные исключения (возможно, ни один).« То, что могут делать спецификации исключений, и некоторые основные компиляторы ** на самом деле ** делают это. – curiousguy
@curiousguy вы прочитали полную статью? Основываясь на вашем комментарии, похоже, что вы остановились после этого предложения. – JaredPar
Не могу поверить, что C++ 0x уже был в 2002 году. Это было долгое время! –
Обзор по http://www.gotw.ca/publications/mill22.htm
Выпуск первый: А «Тип системы Shadow»
Истина, незначительная техническая точка, и ее легко исправить.
Выпуск второй: (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() действительно может бросить что-то они обещали не делать этого, не только не может компилятор предположить, что это не будет (...)
Herb последнее замечание, что " (ES) При выполнении во время выполнения функции будут исключать только перечисленные исключения (возможно, нет). «опровергнуть этот« аргумент »тоже.
Оба из 2 основных точек Херба, очевидно, абсолютно, бесспорно так, по его.
Что еще я могу добавить?
Я считаю, что слова имеют фиксированное значение, которое нельзя изменить по желанию ради «аргумента».
может кто-нибудь опровергнуть любую точку, которую я делаю? Или меня задерживают за то, что они противоречат полубогу Травы Саттера? – curiousguy
Лучший вопрос: можете ли вы на самом деле * доказать * свои баллы? Вы просто говорите «это так, период», что не очень убедительно. Нет ничего плохого в том, чтобы противоречить кому-то. 'Оба 2-х основных точек Херба, очевидно, абсолютно, бесспорно wrong.'. Ну, давайте просто предположим, что это не так очевидно для меня, как для вас. Позаботьтесь, чтобы объяснить, что именно так очевидно? – Xeo
@Xeo Какой момент не очевиден? – curiousguy
Насколько я понимаю, спецификация исключения означает:
I wan't вы (компилятор), чтобы произвести дополнительный код, который гарантирует, что исключение составляет один из этих типов. Если мы не позвоним, пожалуйста, мы тосты. Дополнительная проверка должна быть помещена в (неявный) обработчик исключений (необходимый для его реализации) в каждом вызове.
См. Http://stackoverflow.com/editing-help и http://stackoverflow.com/faq. Это не форум. –
@ Джон Сандерс: это открытый, но законный технический вопрос. Есть причины, по которым функция удаляется из стандарта C++, и их можно объяснить без субъективности или аргументации. –
@ Джонатан: Почему ты направляешь это на меня? –