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
,标准库容器可以安全地进行优化,选择移动元素而不是复制,因为它们知道移动操作不会抛出异常。这通常会导致更高效的代码。