静态成员函数使用decltype时的编译器行为差异及合规性疑问
Clang/GCC/MSVC对静态成员函数
decltype判定的分歧 Clang无法编译以下代码:
#include <concepts> struct k { static void f(); }; // Clang不通过,GCC、MSVC通过 static_assert(std::same_as<decltype(k::f), decltype(k{}.f)>);
核心争议聚焦在decltype(k{}.f)的类型判定上,存在三种可能结果:void()、void (&)()或void (&&)():
- 直接使用
decltype(k{}.f)时,Clang判定其类型为void(),与decltype(k::f)结果不一致,触发断言失败;而GCC和MSVC判定两者类型相同,断言通过。 - 当表达式添加括号变为
decltype((k{}.f))时,Clang与GCC均判定类型为void (&)(),但MSVC判定为void (&&)()。
从上述表现来看,GCC与MSVC似乎都没有将普通形式的k{}.f视为左值表达式来做类型检查。
我认为针对k{}.f这种静态成员函数的访问形式,decltype并不存在特殊例外规则。那么是否可以认为GCC与MSVC的行为不符合C++标准?
内容的提问来源于stack exchange,提问作者303
相关产品推荐
相关产品推荐

