首页 > 后端开发 > C++ > 正文

c++20的Concepts是什么_c++模板约束与概念用法【新特性】

尼克
发布: 2025-12-16 08:15:41
原创
998人浏览过
C++20 Concepts 是用于约束模板参数的类型契约机制,通过命名布尔表达式显式声明要求,提升可读性、可维护性与错误提示质量,支持继承组合、直接约束、requires子句及auto简写,相比SFINAE显著改善错误信息、重载解析和代码意图表达。

c++20的concepts是什么_c++模板约束与概念用法【新特性】

C++20 的 Concepts 是一套用于约束模板参数的机制,它让编译器能在编译早期检查模板实参是否满足特定要求,而不是等到实例化时才报一堆难以理解的错误。它不是语法糖,而是从根本上提升模板可读性、可维护性和错误提示质量的语言特性。

Concept 是什么:类型契约的显式声明

Concept 本质是一个命名的布尔表达式,用来描述“什么样的类型可以作为某个模板的参数”。它把原本散落在模板定义中、靠 SFINAE 或 static_assert 隐含表达的约束,变成清晰、可复用、可组合的语义单元。

  • 比如 std::regular 概念要求类型支持拷贝、赋值、相等比较且满足基本逻辑规则
  • 你可以自定义 Sortable,要求类型支持 operator 且满足严格弱序
  • Concept 可以继承(requires Derived <: base>)或组合(<code>requires A && B),像接口一样分层设计

怎么写和使用 Concept

template<typename t> concept Name = ...;</typename> 定义;在模板声明处用 concept-name<t></t>concept-name auto 约束参数。

  • 直接约束模板参数:template<sortable t> void sort(T* begin, T* end);</sortable>
  • requires 子句细化约束:template<typename t> requires Integral<t> T add(T a, T b);</t></typename>
  • 函数模板参数简写(C++20 新写法):void print(StdFormattable auto x); —— 编译器自动推导并检查 StdFormattable 是否满足

和传统 SFINAE / enable_if 相比有什么优势

Concepts 让约束逻辑从“实现细节”升格为“接口契约”,效果立竿见影:

晓象AI资讯阅读神器
晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

晓象AI资讯阅读神器 72
查看详情 晓象AI资讯阅读神器

立即学习C++免费学习笔记(深入)”;

  • 错误信息更短更准:以前报错可能几百行模板展开,现在直接提示 “static_assert failed: 'T must be CopyConstructible'
  • 重载解析更合理:多个函数模板有相同签名但不同 concept 约束时,编译器能按概念严格性排序选择最优匹配
  • 代码意图一目了然:看到 Container<t></t> 就知道这个 T 必须支持 begin()/end() 和迭代器操作,不用翻定义

常用标准 Concept 和实践建议

标准库提供了大量实用 Concept,如 std::integralstd::floating_pointstd::equality_comparablestd::ranges::range 等,基本覆盖常见需求。

  • 优先用标准 Concept,别重复造轮子;实在要自定义,名字尽量语义明确(如 Hashable 而非 HasHash
  • 避免过度约束:只要求当前函数真正用到的操作,别把“理论上该类型该有的所有能力”全写上
  • 结合 requires 表达式做细粒度检查,比如 requires std::is_nothrow_move_constructible_v<t></t>

基本上就这些。Concepts 不复杂,但容易忽略它对模板工程体验的实质性改善——它让泛型编程从“靠猜+试错”走向“靠契约+保障”。

以上就是c++++20的Concepts是什么_c++模板约束与概念用法【新特性】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号