0

0

C++怎么使用概念(Concepts)_C++20约束模板【规范】

穿越時空

穿越時空

发布时间:2026-02-23 14:54:11

|

554人浏览过

|

来源于php中文网

原创

concepts是c++20引入的编译期模板参数语义约束机制,非运行时检查或接口定义;它通过requires子句或命名concept对类型施加操作可行性约束,提升错误信息可读性,零开销且仅限c++20及更新编译器支持。

c++怎么使用概念(concepts)_c++20约束模板【规范】

Concepts 是什么,不是什么

Concepts 不是运行时检查,也不是接口定义;它是编译期对模板参数的语义约束。你写 std::sortable,编译器不会去跑排序算法验证,而是检查类型是否提供必需的操作(比如 operator、可迭代、可交换等)。它替代的是过去靠 SFINAE 或 <code>static_assert 堆出来的模糊报错,让错误信息从“no type named 'iterator' in 'int'”变成“int does not satisfy sortable”。

常见错误现象:把 Concepts 当成类型别名或运行时断言用;或者以为加了 requires 就能自动推导类型——其实它不参与重载解析的优先级排序,只做硬性过滤。

  • 使用场景:泛型容器、算法库、自定义 trait 约束(如 addable<t u></t>
  • 性能影响:零开销——所有检查在编译期完成,生成代码与手动 static_assert 无异
  • 兼容性:仅 C++20 起支持,GCC 10+、Clang 12+、MSVC 19.29+;C++17 项目不能混用

怎么写一个最小可用的 Concept

最简形式就是用 concept 关键字 + 布尔常量表达式。别急着套 std::ranges 那套,先从判断有没有某个成员函数开始:

template<typename T>
concept has_size = requires(T t) {
    t.size();
};

注意这里 requires 块里写的是“能调用”,不是“返回 int”或“是 const 成员”——那是更细粒度的约束,要额外加条件。

EasySite
EasySite

零代码AI网站开发工具

下载

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

  • 容易踩的坑:requires(T t) 中的 t 是纯占位符,不构造对象;但若类型没有默认构造函数,就得改用 requires(std::declval<t>().size())</t>
  • 参数差异:单参数 concept 直接跟在模板参数后;多参数(如 addable<t u></t>)需显式列出并检查 T + U 是否合法
  • 别写 requires std::is_integral_v<t></t> 这种——这是 type trait,不是 concept;要用就封装成 integral concept

在函数模板中用 requires 还是 concept 名字

两者都能用,但语义不同:requires 是内联约束,适合一次性的简单条件;命名 concept 更利于复用和错误提示。

// 推荐:清晰、可读、报错直接显示概念名
template<has_size T>
void print_size(T&& c) { std::cout << c.size() << '\n'; }

// 可用但不推荐:约束逻辑散落在函数声明里,难复用
template<typename T>
requires requires(T t) { t.size(); }
void print_size(T&& c) { std::cout << c.size() << '\n'; }
  • 使用场景:库作者应优先定义命名 concept;临时脚本或调试时可用 requires 快速验证
  • 错误信息差异:前者报错含 has_size,后者只说“requires clause not satisfied”,调试成本高
  • 注意:不能在非模板上下文中用 concept(比如普通函数参数),会编译失败

和 SFINAE、enable_if 比较时的真实取舍

Concepts 不是 SFINAE 的升级版,而是替代方案——它解决的是同一问题的不同侧面。SFINAE 本质是“让错误不发生”,Concepts 是“让错误说得清”。

  • 如果你的模板需要精细控制重载顺序(比如优先匹配 std::vector 而非任意 Container),SFINAE 仍不可替代;Concepts 只做准入,不做排序
  • 如果你的约束逻辑跨多个模板参数(如 T::value_type == U::key_type),用 Concepts 写起来更直白,不用嵌套 decltypestd::declval
  • 兼容旧代码时,别强行把 std::enable_if_t 全换成 concept——尤其当模板已被广泛特化时,约束变更可能破坏 ABI 或导致重载歧义

最常被忽略的一点:Concepts 对模板参数推导本身没帮助。写 template<has_size t> void f(T)</has_size>,传入 std::string{} 没问题;但传入 42,编译器不会因为 has_size 失败就尝试其他重载——它直接报错,不回退。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

830

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1558

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

551

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

830

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.23

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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