noexcept说明符是函数声明的一部分,承诺不抛异常,否则调用std::terminate;noexcept运算符是编译期工具,以noexcept(expr)形式判断表达式是否被声明为noexcept,用于SFINAE等元编程。

noexcept说明符用于声明函数是否可能抛出异常,而noexcept运算符是一个编译期运算符,用来查询某个表达式是否被声明为不抛异常。
noexcept说明符:函数声明的一部分
它写在函数声明的末尾,告诉编译器该函数承诺不抛出任何异常。一旦加了noexcept,若函数内部或调用链中实际抛出异常,程序会直接调用std::terminate()终止,而不是栈展开。
- 可以带常量表达式,例如noexcept(sizeof(T) > 4),此时是否noexcept取决于该表达式在编译期的值
- 不带表达式(即noexcept)等价于noexcept(true)
- 常见用途包括移动构造函数、移动赋值运算符,以及标准库中要求强异常安全的地方(如std::vector::push_back在满足条件时调用noexcept移动)
noexcept运算符:编译期布尔判断工具
它形如noexcept(expr),返回true或false(类型为bool),表示表达式expr是否被声明为noexcept(注意:只看声明,不检查实际行为)。
- 常用于模板中做SFINAE或constexpr if分支,比如判断能否安全调用移动操作:noexcept(std::move(x))
- 它不求值expr,仅做类型和声明检查,因此可安全用于未定义变量或不完整类型的上下文中
- 示例:static_assert(noexcept(std::declval
().swap(std::declval ())), "swap must be noexcept");
关键区别总结
- noexcept说明符是函数接口契约,影响调用约定和优化,也影响标准库容器的行为选择(如是否对元素执行移动而非拷贝)
- noexcept运算符是元编程设施,只读取函数声明信息,不改变行为,纯用于编译期决策
- 二者名字相同但角色完全不同:一个是“我说我不抛”,一个是“我查它说没说不抛”









