C++20的Concepts是什么?(模板约束示例)

15次阅读

Concepts 是 c++20 中用于对模板参数施加编译期语义约束的机制,它通过具名谓词定义类型必须支持的操作,提升错误诊断精度并简化模板编程。

C++20的Concepts是什么?(模板约束示例)

C++20 的 Concepts 是一种对模板参数施加语义约束的机制,它让编译器能在编译早期检查类型是否满足接口要求,而不是等到实例化后才爆出一长串难以理解的错误。

Concept 是什么:不只是 type trait 的包装

Concept 是一个具名的、可复用的编译期谓词,用于表达“某个类型必须支持哪些操作”。它不是运行时检查,也不改变类型系统,而是为模板提供清晰、可诊断的契约。

例如,要表达“T 必须支持 +==”,可以定义:

template concept AddableAndEquatable =      requires(T a, T b) {         { a + b } -> std::same_as;         { a == b } -> std::convertible_to;     };

函数模板中使用 Concept 约束

可以直接将 concept 作为模板参数的前置条件,替代传统的 enable_if 或 SFINAE 写法:

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

template T add_and_check(T a, T b) {     auto res = a + b;     if (res == a) return b;     return res; }

调用时若传入不满足条件的类型(如 std::vector),编译器会直接报错:“add_and_check requires AddableAndEquatable”,错误位置精准、信息明确。

Concept 可以组合与简化模板重载

  • requires 子句细化特化逻辑,比如区分整型浮点型算法
  • and / or / not 组合多个 concept,例如:Sortable && Copyable
  • 标准库已提供大量内置 concept,如 std::regularstd::predicatestd::invocable,可直接复用

常见误用提醒

  • 不要在 concept 中写具体实现细节(如私有成员访问),它只应描述公开接口行为
  • 避免过度约束:一个 concept 应聚焦单一语义职责,比如 Swappable 不应同时要求 DefaultConstructible
  • concept 名称建议用形容词(Sortable)或名词(InputIterator),保持语义直观

text=ZqhQzanResources