noexcept 说明符
标记不会抛出异常的函数
noexcept 说明符 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
noexcept 的声明内容
noexcept 说明符承诺函数不会抛出异常。如果函数仍然抛出了异常,程序就会调用 std::terminate。
#include <iostream>
int square(int x) noexcept {
return x * x;
}
int main() {
std::cout << square(5) << "\n";
}为什么这很重要
知道函数不会抛出异常后,编译器和库就可以进行优化——例如,在容器扩容期间选择移动而不是拷贝。
移动操作应为 noexcept
std::vector 只有在您的移动构造函数标记为 noexcept 时,才会在重新分配期间使用它;否则为了安全起见会进行拷贝。因此,请将移动操作标记为 noexcept。
struct Buffer {
int* p;
Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};析构函数默认就是 noexcept
从 C++11 开始,析构函数会隐式标记为 noexcept。如果让异常从析构函数中逸出,程序就会终止。
条件 noexcept
noexcept(expr) 会让这一承诺取决于编译期布尔值,这对于需要转发另一类型保证的模板很有用。
template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}使用 noexcept 运算符进行查询
作为运算符使用时,noexcept(expr) 如果表达式声明为不会抛出异常,就会产生 true;这在模板中非常方便。
#include <iostream>
int f() noexcept { return 1; }
int g() { return 2; }
int main() {
std::cout << noexcept(f()) << " " << noexcept(g()) << "\n"; // 1 0
}noexcept 是类型的一部分
从 C++17 开始,noexcept 是函数指针类型的一部分,因此可能抛出异常的函数无法绑定到 noexcept 指针。
不要过度承诺
只有在确定函数不会抛出异常时,才将其标记为 noexcept。一旦违反错误的承诺,整个程序就会崩溃。
适合的 Good 候选项
交换操作、移动操作、析构函数、简单的获取器和算术辅助函数都是天然适合标记为 noexcept 的函数。
noexcept 与 throw()
旧式的动态 throw() 说明已被弃用并移除。在现代 C++ 中请改用 noexcept。
性能与安全性
noexcept 既能说明意图,也能启用重新分配时移动等优化——这是一个影响显著的小型注解。
快速检查
请测试您对 noexcept 的理解。
回顾
您已经学习了 noexcept 说明符如何承诺不抛出异常,并启用重新分配时移动等优化。请将移动操作、交换操作和析构函数标记为 noexcept,在模板中使用条件形式,并且永远不要过度承诺。
常见问题解答
「noexcept 说明符」课时是免费的吗?
是的 — 「noexcept 说明符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「noexcept 说明符」这节课中我会学到什么?
标记不会抛出异常的函数 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「noexcept 说明符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- try、catch、throw
- 异常安全
- noexcept 说明符
- 自定义异常类型