Есть ли другая разница между throw()
а также noexcept
кроме проверки времени выполнения и времени компиляции соответственно?
Википедия C ++ 11 Статья предполагает, что C ++ 03 бросить спецификаторы устарели.
Почему так noexcept
достаточно ли, чтобы покрыть все это во время компиляции?
Спецификаторы исключений устарели, потому что Спецификаторы исключений — вообще ужасная идея.. noexcept
был добавлен, потому что это единственное разумно полезное использование спецификатора исключения: знать, когда функция не будет бросить исключение. Таким образом, это становится двоичным выбором: функции, которые будут выбрасывать, и функции, которые не будут выбрасывать.
noexcept
был добавлен, а не просто удалить все спецификаторы броска, кроме throw()
так как noexcept
более мощный. noexcept
может иметь параметр, который компилируется во время компиляции. Если логическое значение истинно, то noexcept
палочки. Если логическое значение ложно, то noexcept
не прилипает и функция может скинуть.
Таким образом, вы можете сделать что-то вроде этого:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
Есть ли CreateOtherClass
бросить исключения? Это может, если T
по умолчанию конструктор может. Как мы говорим? Как это:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
Таким образом, CreateOtherClass()
будет бросать, если конструктор по умолчанию данного типа бросает. Это устраняет одну из основных проблем со спецификаторами исключений: их неспособность распространяться вверх по стеку вызовов.
Вы не можете сделать это с throw()
,
noexcept
не проверяется во время компиляции.
Реализация не должна отклонять выражение просто потому, что при выполнении оно выдает или может выдать исключение, которое не разрешает содержащая функция.
Когда функция, которая объявлена noexcept
или же throw()
попытки бросить исключение единственная разница в том, что один вызывает terminate
и другие звонки unexpected
и последний стиль обработки исключений фактически устарел.
std :: непредвиденный () вызывается средой выполнения C ++, когда нарушается спецификация динамического исключения: исключение выдается из функции, спецификация исключения которой запрещает исключения этого типа.
std :: непредвиденный () также может быть вызван непосредственно из программы.
В любом случае, std :: непредвиденный вызов вызывает установленный в данный момент std :: surprise_handler. Стандартный std ::ести_handler вызывает std :: terminate.