You need to enable JavaScript to run this app. C++中noexcept函数默认实参抛异常的行为及继承类检测问题
优惠活动
大模型
产品
解决方案
定价
更多

C++中noexcept函数默认实参抛异常的行为及继承类检测问题

问题1:前两个测试结果的分析正确性

你的分析完全符合C++标准规则。
noexcept运算符判断表达式是否为潜在抛出时,会将当前调用实际用到的默认实参作为立即子表达式纳入检查范围:

  • 调用B(std::declval<B>())时需要求值第二个参数的默认实参(throw 0, 0),其中的throw表达式属于潜在抛出,因此整个表达式的noexcept运算结果为false
  • 调用B(std::declval<B>(), 1)时不需要使用默认实参,被调用的B类移动构造本身显式声明为noexcept,因此noexcept运算结果为true
    这两个测试结果的表现是符合标准预期的。

问题2:第三个测试结果的产生原因

你对标准规则的理解是正确的,按照标准规定noexcept(D(std::declval<D>()))应当返回false,你实际测试得到的相反结果是GCC、Clang的已知实现缺陷。
你补充的标准示例已经明确标注:隐式生成的D类移动构造函数,调用基类B的移动构造时会用到其默认实参,默认实参的潜在抛出性会传递到D的移动构造的异常规范中,因此D的移动构造应当是潜在抛出的。
当前GCC、Clang在处理隐式生成的特殊成员函数的异常规范时,没有完整实现对被调用函数默认实参的潜在抛出性递归检查逻辑,才会错误返回true,属于编译器未对齐标准要求的问题。


内容的提问来源于stack exchange,提问作者Pluto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:09:03