全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ requires子句怎么写 c++ Concepts约束详解【详解】

C++20 的 requires 子句是 Concepts 的核心语法,用于编译期静态约束模板参数;常见位置在模板参数后、函数声明前,支持布尔常量表达式、concept 名复用及 requires 表达式检查表达式合法性。

C++ 的 requires 子句用于在模板定义中直接表达对模板参数的约束,它是 C++20 Concepts 的核心语法之一。它不是“写在函数末尾的条件判断”,而是编译期静态检查的声明式约束工具,让错误信息更清晰、接口意图更明确。

requires 子句的基本写法

最常见写法是跟在模板参数列表后、函数声明前,用 requires 关键字引导一个布尔常量表达式:

template
requires std::is_integral_v
T add(T a, T b) { return a + b; }

也可以把约束写成内联形式(更紧凑):

template
  requires std::is_integral_v  // 注意:这里不能加分号
T add(T a, T b) { return a + b; }

注意:requires 后必须是编译期可求值的常量表达式(constexpr bool),不能含运行时变量或非 constexpr 函数调用。

用 concept 名字简化 requires 子句

比起重复写长表达式,推荐先定义 concept,再在 requires 中复用:

template
concept Integral = std::is_integral_v;

template
requires Integral
T add(T a, T b) { return a + b; }

这样语义清晰,也支持逻辑组合:

  • requires Integral && (sizeof(T) > 2)
  • requires Integral || FloatingPoint(需提前定义 FloatingPoint
  • requires !std::is_const_v(带否定)

requires 子句的位置变体

requires 不只出现在函数模板前,还有三种合法位置:

  • 函数模板头之后(最常用):template<...> requires ... void f();
  • 作为函数声明的一部分(尾随 requires)void f() requires C;(适用于类成员函数或已有模板参数推导上下文)
  • 在 template 参数列表中直接约束模板形参template void f(T);(这是 concept 作为类型约束的简写,等价于 template requires Integral

三者语义一致,选哪种取决于可读性和上下文习惯。尾随写法在类内定义成员函数时更自然。

requires 表达式:检查表达式是否合法

除了布尔常量,requires 还支持 requires 表达式(一种特殊的 lambda 式语法),用于检查某表达式能否通过编译:

template
concept Addable = requires(T a, T b) {
  { a + b } -> std::same_as;  // 要求 a+b 存在且返回 T 类型
  { a += b };                        // 只要求能编译,不关心返回值
};

这种写法本质是编译器尝试实例化花括号内的代码块;只要所有子句都满足,整个 requires 表达式为 true。它比 std::is_invocable 等 trait 更灵活,是构建自定义 concept 的主力。

Concepts 和 requires 不是为了炫技,而是让模板错误从“一长串无法理解的内部展开”变成“error: concept 'Integral' not satisfied by 'std::string'”。写清楚约束,既是帮编译器,也是帮下一个读你代码的人。


# 工具  # ai  # c++  # String  # 常量  # 成员函数  # Error  # bool  # void  # 布尔常量  # Lambda  # 接口  # 函数模板  # 形参  # 子句  # 布尔  # 的人  # 复用  # 这是  # 已有  # 出现在  # 适用于  # 它是  # 三种 


相关文章: 如何自定义建站之星网站的导航菜单样式?  建站之星如何通过成品分离优化网站效率?  建站之星会员如何解锁更多建站功能?  如何在Windows虚拟主机上快速搭建网站?  如何正确下载安装西数主机建站助手?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星在线版空间:自助建站+智能模板一键生成方案  全景视频制作网站有哪些,全景图怎么做成网页?  如何在建站主机中优化服务器配置?  深圳网站制作平台,深圳市做网站好的公司有哪些?  C++时间戳转换成日期时间的步骤和示例代码  代购小票制作网站有哪些,购物小票的简要说明?  郑州企业网站制作公司,郑州招聘网站有哪些?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何在阿里云虚拟主机上快速搭建个人网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  中山网站制作网页,中山新生登记系统登记流程?  如何快速查询网站的真实建站时间?  5种Android数据存储方式汇总  官网网站制作腾讯审核要多久,联想路由器newifi官网  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  如何通过老薛主机一键快速建站?  如何通过建站之星自助学习解决操作问题?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  平台云上自助建站如何快速打造专业网站?  建站之星代理商如何保障技术支持与售后服务?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  家具网站制作软件,家具厂怎么跑业务?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  大同网页,大同瑞慈医院官网?  建站主机与服务器功能差异如何区分?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何通过服务器快速搭建网站?完整步骤解析  清除minerd进程的简单方法  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何用景安虚拟主机手机版绑定域名建站?  如何在IIS中新建站点并配置端口与IP地址?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  如何选择适配移动端的WAP自助建站平台?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  网站设计制作公司地址,网站建设比较好的公司都有哪些?  定制建站方案优化指南:企业官网开发与建站费用解析  实例解析angularjs的filter过滤器  建站之星安装步骤有哪些常见问题?  如何制作算命网站,怎么注册算命网站?  如何在阿里云域名上完成建站全流程?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站上传速度慢?如何优化加速网站加载效率? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。