C++语法——noexcept 关键字



noexcept


问题

在数据库项目 CMU15445 中的 Project #2 中,有以下一个构造函数的实现:

BasicPageGuard(BasicPageGuard &&that) noexcept;

这里为什么选择加 noexcept

解释

关键字 noexcept 在C++中用来指定一个函数不会抛出异常。在函数声明后使用 noexcept 表明该函数保证不会抛出任何异常,这允许编译器进行某些优化,因为它知道不需要在这个函数中处理异常。

对于 BasicPageGuard(BasicPageGuard &&that) noexcept; 这个移动构造函数来说,使用 noexcept 指定了在移动 BasicPageGuard 对象时,这个操作是不会抛出异常的。如果一个操作被标记为 noexcept,但实际上在运行时抛出了异常,程序将会调用 std::terminate,这通常会导致程序立即终止。

在移动语义中使用 noexcept 是非常有用的,尤其是在涉及到对象容器,如 std::vector 这类需要重新分配内存并移动其元素的场景。如果移动构造函数被标记为 noexcept,标准库容器可以安全地进行优化,选择移动元素而不是复制,因为它们知道移动操作不会抛出异常。这通常会导致更高效的代码。

posted @ 2023-11-05 17:28  vLiion  阅读(110)  评论(0编辑  收藏  举报