mmxingye

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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   独立树  阅读(232)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2022-04-10 10 | 到底应不应该返回对象?
2022-04-10 09 | 易用性改进 II:字面量、静态断言和成员函数说明符
点击右上角即可分享
微信分享提示