Z
ZHANK
编程在线教程C++ 教程C++20 Concepts 概念
并发与模板进阶

C++20 Concepts 概念

concept 定义约束、requires 子句、标准概念库、错误提示改善

C++20 Concepts 概念

模板的错误信息晦涩难懂?Concepts 在编译前就检查类型约束——错误清晰,IDE 友好。

学完本章你将: 掌握 concept 定义约束、requires 子句、标准概念库。


定义 concept

cpp
#include <concepts>

// 定义一个概念:支持 + 运算
template <typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::same_as<T>;  // a + b 的结果是 T 类型
};

// 使用 concept 约束模板
template <Addable T>
T add(T a, T b) { return a + b; }

add(1, 2);        // ✅
add("a", "b");    // ❌ 编译错误——清晰:string 不满足 Addable

requires 子句

cpp
// 方式 1:requires 子句
template <typename T>
    requires std::integral<T>
T multiply(T a, T b) { return a * b; }

// 方式 2:concept 替代 typename
template <std::integral T>
T multiply(T a, T b) { return a * b; }

// 方式 3:简写
auto multiply(std::integral auto a, std::integral auto b) {
    return a * b;  // C++20 函数模板简写
}

标准概念库

cpp
std::integral<T>       // 整数类型
std::floating_point<T> // 浮点类型
std::same_as<T, U>     // 同一类型
std::derived_from<T, U> // 继承关系
std::convertible_to<T, U> // 可转换
std::movable<T>        // 可移动
std::copyable<T>       // 可拷贝