C++非模板函数加常量布尔requires子句是否合法及属无诊断病态?
#include <iostream> struct S { int mult(int x) requires (true) { return x; } int mult(int x) requires (false) { return x * 2; } }; int main() { std::cout << S{}.mult(5) << std::endl; }
1. 上述代码是否属于合法C++代码
不属于。
根据C20标准规定,requires约束子句仅能作用于模板函数、类模板的成员函数,或是类/函数模板的特化版本,不能附加到普通非模板函数上。g11的报错完全符合标准要求,clang13能编译通过属于该版本对C20 concepts特性的实现存在bug,过度放宽了语法校验规则。
2. 若语法合法,包含恒为false的requires子句的程序性质
首先,“非模板函数可附加requires子句”的前提在标准中不存在,仅从约束匹配规则推演:如果允许非模板函数附加requires子句,非模板函数的约束条件在编译期即可确定最终值,恒为false的约束对应的函数始终无法被匹配,这种情况属于ill-formed(病态)且要求编译器必须给出诊断,不属于无需诊断的未定义行为范畴。
clang++13输出10的结果也进一步佐证了该版本的concepts实现存在逻辑缺陷,正常符合规则的重载决议应当选择requires (true)的版本输出5,而非相反。
内容的提问来源于stack exchange,提问作者tyckesak
相关产品推荐
相关产品推荐

