C++ noexcept关键字的最佳实践
请说明noexcept关键字在C++中的双重作用(说明符和运算符),以及何时应标记noexcept。
回答
Yahuda
noexcept有两种用法:
-
noexcept说明符:声明函数不抛异常
void func() noexcept; // 抛出异常则调用std::terminate() void func() noexcept(false); // 可能抛出 -
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时会使用拷贝替代移动。