贝利信息

C++中的noexcept关键字有什么作用?C++异常安全规范详解【现代C++】

日期:2026-01-06 00:00 / 作者:裘德小鎮的故事
noexcept是C++11引入的关键字,用于声明函数不抛异常,违反承诺将调用std::terminate;它影响编译器优化、标准库行为(如移动操作选择)、函数类型签名,并支持编译期异常检查。

noexcept 是 C++11 引入的关键字,用来显式声明一个函数**不会抛出任何异常**。它既是编译器的承诺,也是调用者的契约——一旦标记为 noexcept,函数体内若意外抛出异常(且未被捕获),程序将立即调用 std::terminate() 终止执行,而不是尝试栈展开。

noexcept 的核心作用:优化与安全边界

它不只是“说明不抛异常”,更直接影响编译器行为和标准库决策:

noexcept 的两种写法:简单声明 vs. 条件表达式

基本形式:void func() noexcept; 表示硬性承诺不抛异常。

更灵活的是带条件表达式的写法:void func() noexcept(noexcept(other_func()));

noexcept 不是万能的:常见误区

它不提供运行时保护,也不自动让函数变安全:

异常安全的三个等级,noexcept 对应最强一级

C++ 社区通常把异常安全分为三类:

比如 std::swapstd::unique_ptr 的移动操作都要求 noexcept,否则容器在异常场景下无法保证强安全。

基本上就这些。noexcept 不复杂但容易忽略,关键是把它当作接口契约来设计,而不是事后补的性能标签。