含noexcept(5)的C++代码兼容MSVC/Clang却被GCC拒绝,哪个编译器合规?
问题背景
我通过经典C书籍列表学习C,尤其通过《C++ Primer》掌握了noexcept相关概念。编写测试代码巩固知识时,遇到如下代码:
void f() noexcept(5) // 被MSVC接受但被GCC拒绝 { }
这段代码在不同编译器及版本下的编译结果如下:
| 编译器 | C++版本 | 是否通过编译 |
|---|---|---|
| GCC | C++17 | 否 |
| GCC | C++20 | 否 |
| Clang | C++17 | 是 |
| Clang | C++20 | 否 |
| MSVC | C++17 | 是 |
| MSVC | C++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
相关产品推荐
相关产品推荐

