C++20友元类模板requires子句Sonar报错:是分析器缺陷还是代码不合规?
结论:你的代码符合C++标准,Sonar静态分析器的报错属于误判
原因说明
- 你的友元模板声明与原类模板的约束语义完全等价:原类模板的参数约束是
Underlying概念修饰的类型参数+Frac非类型参数,再加上detail::ValidParams约束;友元声明只是换了参数名,约束逻辑完全一致。C++标准允许模板重声明(包括友元场景)的约束语义等价即可,不需要字面完全相同。 - C++标准13章模板部分中,并未要求类模板的友元声明必须和原模板的
requires子句字面完全一致,只要两者的约束条件在语义上等价,就属于合法的声明。 - 主流编译器Clang和GCC都能正常编译这段代码,这是代码符合标准的有力佐证——编译器对C++标准的实现是最直接的权威参考。
内容的提问来源于stack exchange,提问作者Pavel Kirienko
相关产品推荐
相关产品推荐

