consteval声明不匹配:MSVC可编译,GCC/Clang报错,符合C++20标准吗?
C++20标准下consteval成员函数定义的编译器行为分歧
我编写了如下C++程序,该程序可在MSVC中编译通过,但无法在GCC和Clang中编译:
template<int x> struct X { consteval static int get(); int f() const; }; // 可在MSVC编译,但GCC和Clang报错 template<int x> int X<x>::get(){ return x; } int main() { constexpr int i = X<4>::get(); }
GCC的报错信息如下:
error: redeclaration 'static int X<x>::get()' differs in 'consteval' from previous declaration 8 | template<int x> int X<x>::get(){ return x; } | ^~~~ <source>:4:22: note: previous declaration 'static consteval int X<x>::get()' 4 | consteval static int get(); | ^~~ <source>: In function 'int main()': <source>:12:30: error: 'static consteval int X<x>::get() [with int x = 4]' used before its definition 12 | constexpr int i = X<4>::get(); | ~~~~~~~~~^~ <source>: At global scope: <source>:4:22: warning: inline function 'static consteval int X<x>::get() [with int x = 4]' used but never defined 4 | consteval static int get(); | ^~~
根据C++20标准,GCC和Clang的行为是正确的,MSVC的行为不符合标准。
原因在于:consteval是函数类型的一部分,类内声明的consteval静态成员函数,在类外定义时必须显式重复consteval说明符,否则声明和定义的函数类型不匹配,属于重声明错误。
正确的类外定义应该修改为:
template<int x> consteval int X<x>::get(){ return x; }
内容的提问来源于stack exchange,提问作者user20562802
相关产品推荐
相关产品推荐

