You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含noexcept(5)的C++代码兼容MSVC/Clang却被GCC拒绝,哪个编译器合规?

问题背景

我通过经典C书籍列表学习C,尤其通过《C++ Primer》掌握了noexcept相关概念。编写测试代码巩固知识时,遇到如下代码:

void f() noexcept(5) // 被MSVC接受但被GCC拒绝
{

}

这段代码在不同编译器及版本下的编译结果如下:

编译器C++版本是否通过编译
GCCC++17否
GCCC++20否
ClangC++17是
ClangC++20否
MSVCC++17是
MSVCC++20是

GCC的报错信息为:error: narrowing conversion of '5' from 'int' to 'bool',请问哪个编译器的处理符合C++标准?

标准解读与结论

根据C++标准的明确规定:

  • C++17及更早版本:noexcept的参数要求是一个常量表达式,其结果会被隐式转换为bool类型。这种隐式转换属于标准允许的上下文,并不属于需要报错的窄化转换范畴。因此Clang和MSVC在C++17模式下编译通过的行为是符合标准的,而GCC的报错属于编译器开启严格检查后的额外限制。
  • C++20及以后版本:标准对noexcept的参数做了更严格的要求,明确规定它必须是布尔类型的常量表达式,不再允许数值到布尔的隐式转换。此时GCC和Clang拒绝编译的行为符合标准,MSVC继续接受该代码则属于编译器的非标准扩展。

总结:

  • C++17环境:Clang、MSVC的处理符合标准;
  • C++20环境:GCC、Clang的处理符合标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:15:36