Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

According to the C++ Standard, [except.spec], paragraph 8 [ISO/IEC 14882-2014]:

A function is said to allow an exception of type E if the constant-expression in its noexcept-specification evaluates to false or its dynamic-exception-specification contains a type T for which a handler of type T would be a match (15.3) for an exception of type E.

If a function declared with a dynamic-exception-specification throws an exception of a type that would not match the exception-specification, the function std::unexpected() is called. The behavior of this function can be overridden but, by default, causes an exception of std::bad_exception to be thrown. Unless std::bad_exception is listed in the exception-specification, the function std::terminate() will be called.

...

Code Block
bgColor#ccccff
langcpp
#include <vector>

void f(std::vector<int> &v, size_t s) {
  v.resize(s); // May throw, but that is okay
}

Implementation Details

Some vendors provide language extensions for specifying whether or not a function throws. For instance, Microsoft Visual Studio provides __declspec(nothrow)), and Clang supports __attribute__((nothrow)). Currently, the vendors do not document the behavior of specifying a nonthrowing function using these extensions. Throwing from a function declared with one of these language extensions is presumed to be undefined behavior.

...

Bibliography

[GNU]Declaring Attributes of Functions
[ISO/IEC 14882-2014]15.4, "Exception Specifications"
[MSDN]nothrow (C++)[GNU]Declaring Attributes of Functions

 

...