You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 14:42:00