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

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 让约束逻辑从“实现细节”升格为“接口契约”,效果立竿见影:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~