CodeWalk

C++ noexcept关键字的最佳实践

作者:Yahuda · 2026-05-30 12:55

请说明noexcept关键字在C++中的双重作用(说明符和运算符),以及何时应标记noexcept。

回答

Yahuda

noexcept有两种用法:

  1. noexcept说明符:声明函数不抛异常

    void func() noexcept;  // 抛出异常则调用std::terminate()
    void func() noexcept(false);  // 可能抛出
    
  2. noexcept运算符:编译期检查表达式是否noexcept

    template<typename T>
    void move_if_noexcept(T& a, T& b) {
        if constexpr (noexcept(T(std::move(a))))
            a = std::move(b);
    }
    

最佳实践:

  • 必须noexcept:析构函数、swap、移动构造/赋值(尽量)
  • 应该noexcept:返回值查询(size/empty)、getter函数
  • 不应noexcept:内存分配、I/O操作、用户回调

注意:std::vector在元素移动操作非noexcept时会使用拷贝替代移动。