mmxingye

导航

02 | C++17中的异常规格说明(noexcept)

异常规范 (throw、noexcept) (C++) | Microsoft Learn

相信大家都已经熟悉了在标准库函数后面常常看到的 noexcept 函数。其含义是明确告诉编译器该函数不会抛出异常。(但如果你抛出了异常,程序会立即中止,注意立即中止和未定义行为不是一个概念!!).

推荐大家了解 c++17 版本之后的异常规格说明,c++14 之前的大致看下即可


异常规格说明

异常规范 含义
noexcept noexcept(true) throw() 函数不会引发异常。
/std:c++14 模式(默认)下,noexceptnoexcept(true) 是等效的。 从声明为 noexceptnoexcept(true) 的函数引发异常时,将调用 std::terminate
当在 /std:c++14 模式下从声明为 throw() 的函数引发异常时,结果为未定义的行为。 未调用任何特定函数。 这与 C++14 标准不同,后者要求编译器调用 std::unexpected

Visual Studio 2017 版本 15.5 及更高版本:
/std:c++17 模式下,noexceptnoexcept(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)

posted on 2023-04-10 15:33  独立树  阅读(158)  评论(0编辑  收藏  举报