Есть ли какая-то разница между throw()
и, noexcept
кроме проверки во время выполнения и во время компиляции, соответственно?
В этой статье Wikipedia C ++ 11 предполагается, что спецификаторы throw C ++ 03 устарели.
Почему так, noexcept
достаточно ли для того, чтобы охватить все это во время компиляции?
[Примечание: я проверил этот вопрос и эту статью , но не смог определить вескую причину прекращения поддержки.]
noexcept
может потребоваться проверка во время выполнения. Основное различие между ними в том , что ломаяnoexcept
причиныstd::terminate
, разбиваяthrow
причиныstd::unexpected
. Также в этих случаях немного другое поведение при раскручивании стека.Ответы:
Спецификаторы исключений устарели, потому что спецификаторы исключений, как правило, ужасная идея .
noexcept
был добавлен, потому что это единственное разумно полезное использование спецификатора исключения: знание того, когда функция не генерирует исключение. Таким образом, это становится двоичным выбором: функции, которые будут вызывать и функции, которые не будут выбрасывать.noexcept
был добавлен вместо того, чтобы просто удалить все спецификаторы выброса, кроме того,throw()
чтоnoexcept
он более мощный.noexcept
может иметь параметр, который во время компиляции преобразуется в логическое значение. Если логическое значение истинно, тоnoexcept
прилипает. Если логическое значение false, тоnoexcept
функция не прилипает и функция может выбросить.Таким образом, вы можете сделать что-то вроде этого:
Выбрасывает
CreateOtherClass
исключения? Может, еслиT
конструктор по умолчанию может. Как мы узнаем? Как это:Таким образом,
CreateOtherClass()
будет сгенерировано, если конструктор по умолчанию данного типа выбрасывает. Это устраняет одну из основных проблем со спецификаторами исключений: их неспособность распространяться вверх по стеку вызовов.Вы не можете этого сделать с
throw()
.источник
noexcept
. Я никогда не использовалthrow()
спецификатор и пытаюсь определить,noexcept
действительно ли он дает какие-либо преимущества (кроме проверенной компилятором документации).std::terminate
. что НАМНОГО ХУЖЕ ! код может проникнуть в выпуски, в которых отмечены функции,noexcept
и во время выполнения (то есть на сайтах клиентов) обнаруживаются нарушения. Я имел в виду гарантии компилятор для генерации кода , который не бросать исключения в первую очередь.throws()
то при возникновении исключения стек должен быть размотан до области действия этой функции (так, чтобы все автоматические переменные в функции были уничтожены), после чегоterminate()
вызывается (черезunexpected()
). Если функция отмечена,noexcept
то при возникновении исключения вызывается terminate (разворачивание стека определяется реализацией).noexcept
не проверяется во время компиляции.Когда функция объявляется
noexcept
илиthrow()
пытаетсяterminate
вызвать исключение, единственное различие состоит в том, что одна вызывает и другие вызовы,unexpected
а последний стиль обработки исключений фактически устарел.источник
throw()
/noexcept
, проверка времени компиляции гарантирует, что переопределитель также имеет.std::unexpected()
вызывается средой выполнения C ++, когда нарушается спецификация динамического исключения: исключение выбрасывается из функции, спецификация исключения которой запрещает исключения этого типа.std::unexpected()
также может быть вызван прямо из программы.В любом случае
std::unexpected
вызывает установленный в данный моментstd::unexpected_handler
.std::unexpected_handler
Звонки по умолчаниюstd::terminate
.источник