无括号requires的C++代码编译分歧:MSVC通过GCC报错,谁合规?
关于C++ requires表达式括号要求的标准符合性确认
以下是一段未用括号包裹requires表达式的C++代码:
#include <type_traits> template<typename T> requires !std::is_enum_v<T> void foo(T) { } int main() { foo(4); //msvc编译通过但gcc和clang报错 }
这段代码可通过MSVC编译,但GCC和Clang会报错,其中GCC的报错信息如下:
<source>:3:31: error: expression must be enclosed in parentheses 3 | template<typename T> requires !std::is_enum_v<T> | ^~~~~~~~~~~~~~~~~~ | ( ) Compiler returned: 1
明确不需要解决方案(已知添加括号可解决),仅从学术角度确认:GCC和Clang的行为符合C++标准,MSVC不符合。
标准依据说明
根据C++20标准对requires子句的语法定义,当requires后的表达式以一元运算符(如!)开头时,必须用括号包裹该表达式。这类表达式不属于语法定义中的“primary-expression”范畴,不加括号会导致语法歧义,标准要求编译器对此报错。
内容的提问来源于stack exchange,提问作者user20562802
相关产品推荐
相关产品推荐

