02 | C++17中的异常规格说明(noexcept)
异常规范 (throw、noexcept) (C++) | Microsoft Learn
相信大家都已经熟悉了在标准库函数后面常常看到的 noexcept 函数。其含义是明确告诉编译器该函数不会抛出异常。(但如果你抛出了异常,程序会立即中止,注意立即中止和未定义行为不是一个概念!!).
推荐大家了解 c++17 版本之后的异常规格说明,c++14 之前的大致看下即可
异常规格说明
异常规范 | 含义 |
---|---|
noexcept noexcept(true) throw() |
函数不会引发异常。 在 /std:c++14 模式(默认)下,noexcept 和 noexcept(true) 是等效的。 从声明为 noexcept 或 noexcept(true) 的函数引发异常时,将调用 std::terminate 。 当在 /std:c++14 模式下从声明为 throw() 的函数引发异常时,结果为未定义的行为。 未调用任何特定函数。 这与 C++14 标准不同,后者要求编译器调用 std::unexpected 。 Visual Studio 2017 版本 15.5 及更高版本: 在 /std:c++17 模式下,noexcept 、noexcept(true) 和 throw() 都是等效的。 在 /std:c++17 模式下,throw() 是 noexcept(true) 的别名。 在 /std:c++17 模式和更高版本模式中,当从用上述任何规范声明的函数引发异常时,将按 C++17 标准要求调用 std::terminate 。 |
noexcept(false) throw(...) 无规范 |
函数可以引发任何类型的异常。 |
throw(type) |
(C++14 和更早版本)函数可以引发 type 类型的异常。 编译器接受语法,但将其解释为 noexcept(false) 。 在 /std:c++17 模式和更高版本模式中,编译器发出警告 C5040。 |
总结:
如果要明确告诉编译器函数不抛出异常,请使用 noexcept 进行说明——主要场景之一在于类的移动赋值函数。
不要使用
throw(type)
这样的语法 。比如说 :int f1() throw(int,char)