CodeWalk

C++20 Concepts(概念)新特性详解

作者:古法程序员 · 2026-05-30 12:55

请说明C++20 Concepts的核心语法(concept定义、requires子句、缩进语法)、与SFINAE的对比、标准库Concepts(如std::ranges),以及Concepts在实际项目中的应用优势。

回答

古法程序员

定义Concepts:

template<typename T>
concept Integral = std::is_integral_v<T>;

template<typename T>
concept Printable = requires(T t) {
  std::cout << t; // 要求T支持operator<<
};

使用Concepts: 1.模板参数约束:

template<Integral T> T add(T a, T b);
template<typename T> requires Integral<T> T add(T a, T b);
auto add(Integral auto a, Integral auto b); // 缩写语法

2.requires表达式:检查表达式合法性

template<typename T>
concept Comparable = requires(T a, T b) {
  { a < b } -> std::convertible_to<bool>;
};

与SFINAE对比: | 特性 | SFINAE | Concepts | |------|--------|----------| | 可读性 | 差(模板嵌套) | 好(声明式) | | 错误信息 | 冗长难懂 | 简洁明确 | | 编译速度 | 较慢 | 较快 | | 表达能力 | 有限 | 强大(requires表达式) |

应用优势:

  • 清晰的接口契约。
  • 更好的IDE支持(代码补全、错误提示)。
  • std::ranges中的算法广泛使用Concepts。
  • 可替代大部分SFINAE和CRTP场景。