C++20 标准概念

1. 所有标准概念的概述

“类型和对象基本概念”表列出了类型和对象的基本概念。
“范围、迭代器和算法概念”表列出了范围、视图、迭代器和算法的概念。
“辅助概念”表列出的概念主要用作其他概念的构建块,通常不会让应用程序开发者直接使用。

头文件和命名空间
标准概念在不同的头文件中定义:
• 头文件<concepts> 中定义了许多基本概念,其中包括<ranges> 和<iterator>。
• 迭代器的概念在头文件<iterator> 中定义。
• 范围的概念在头文件<ranges> 中定义。
• <compare> 中定义了three_way_comparable 的概念(几乎包含在所有其他头文件中)。
• uniform_random_bit_generator 在<random> 中定义。
几乎所有的概念都定义在命名空间std 中,唯一的例外是range 概念,它定义在命名空间
std::ranges 中。

1.1 类型和对象的基本概念

 1. 2 辅助概念

1. 3 范围、迭代器和算法的概念 

1.4. 标准概念的包含

C++ 标准库提供的概念经过精心设计,以便包含其他概念,其建立了一个相当复杂的包含图。

 

2.语言相关的概念

2.1 算法概念

std::integral<T>
• 保证类型T 是整型(包括bool 和所有字符类型)。
• 要求:
– 类型特性std::is_integral_v<T> 为true
std::signed_integral<T>
• 保证类型T 是有符号整型(包括有符号字符类型,可能是char)。
• 要求:
– 需要满足std::integral<T>
– 类型特性std::is_signed_v<T> 为true
std::unsigned_integral<T>
• 保证类型T 是无符号整型(包括bool 和无符号字符类型,可能是char)。
• 要求:
– 需要满足std::integral<T>
– 类型特性std::is_signed_v<T> 为true
std::floating_point<T>
• 保证类型T 是浮点类型(float、double 或long double)。
• 引入这个概念是为了能够定义数学常数。
• 要求:
– 类型特性std::is_floating_point_v<T> 为true 

2.2 对象概念

对于对象(既不是引用,也不是函数,也不是void 的类型),有一个所需基本操作的层次结构。
std::movable<T>
• 保证类型T 是可移动和可交换的。可以移动构造、移动赋值,以及与该类型的另一个对象交
换。
• 要求:
– 需要满足std::move_constructible<T>
– 需要满足std::assignable_from<T&, T>
– 需要满足std::swappable<T>
– T 既不是引用,也不是函数,也不是void
std::copyable<T>
• 保证类型T 是可复制的(可移动和可交换)。
• 要求:
– 需要满足std::movable<T>
– 需要满足std::copy_constructible<T>
– std::assignable_from 用于任意T,T&,const T,以及const T& 转换为T&
– 需要满足std::swappable<T>
– T 既不是引用,也不是函数,也不是void
std::semiregular<T>
• 保证类型T 是半常规的类型(可以默认初始化、复制、移动和交换)。
• 要求:
– 需要满足std::copyable<T>
– 需要满足std::default_initializable<T>
– 需要满足std::movable<T>
– 需要满足std::copy_constructible<T>
– std::assignable_from 用于任意T,T&,const T,以及const T& 转换为T&
– 需要满足std::swappable<T>
– T 既不是引用,也不是函数,也不是void
std::regular<T>
• 保证类型T 是常规的(可以默认初始化、复制、移动、交换和检查相等性)。
• 要求:
– 需要满足std::semiregular<T>
– 需要满足std::equality_comparable<T>
– 需要满足std::copyable<T>
– 需要满足std::default_initializable<T>
– 需要满足std::movable<T>
– 需要满足std::copy_constructible<T>
– std::assignable_from 用于任意T,T&,const T,以及const T& 转换为T&
– 需要满足std::swappable<T>
– T 既不是引用,也不是函数,也不是void

2.3 概念间的关系类型

std::same_as<T1, T2>
• 保证T1 和T2 类型相同。
• 概念两次调用std::is_same_v 类型特性,以确保与参数的顺序无关。
• 要求:
– 类型特性std::is_same_v<T1, T2> 为true
– 与T1 和T2 的顺序无关
std::convertible_to<From, To>
• 保证From 类型的对象隐式和显式可转换为To 类型的对象。
• 要求:
– 类型特性std::is_convertible_v<From, To> 为true
– 支持从From 到To 的static_cast
– 可以将From 类型的对象作为To 返回
std::derived_from<D, B>
• 保证D 类型是从B 类型公开派生的(或者D 和B 是相同的),D 类型的指针都可以转换为B 类
型的指针。换句话说: 保证了D 引用/指针可以用作B 引用/指针。
• 要求:
– 类型特性std::is_base_of_v<B, D> 为true
– 对于类型D 到B 的const 指针,类型特性std::is_convertible_v 为true
std::constructible_from<T, Args...>
• 保证可以用Args…类型的参数初始化一个T 类型的对象。
• 要求:
– 需要满足std::destructible<T>
– 类型特性std::is_constructible_v<T, Args...> 为true
std::assignable_from<To, From>
• 保证可以将From 类型的值移动或复制赋值给To 类型的值。
赋值还必须产生原始To 对象。
• 要求:
– To 必须是一个左值引用
– std::common_reference_with<To, From> 满足类型的const 左值引用
– 必须支持赋值运算符,并产生与To 相同的类型
std::swappable_with<T1, T2>
• 保证类型T1 和T2 的值可以交换。
• 要求:
– 需要满足std::common_reference_with<T1, T2>
– 任意两个T1 和T2 类型的对象,都可以通过使用std::ranges::swap() 交换值。
std::common_with<T1, T2>
• 保证类型T1 和T2 共享一个可以显式转换为的公共类型。
• 要求:
– 类型特性std::common_type_t<T1, T2> 会产生一个类型
– 其通用类型支持static_cast
– 这两种类型的引用共享一个common_reference 类型
– 与T1 和T2 的顺序无关
std::common_reference_with<T1, T2>
• 保证类型T1 和T2 共享一个common_reference 类型,可以显式和隐式地转换为该类型。
• 要求:
– 类型特性std::common_reference_t<T1, T2> 会产生一个类型
– 这两种类型可通过std::convertible_to 转换为公共引用类型
– 与T1 和T2 的顺序无关

2.4 比较概念

std::equality_comparable<T>
• 保证类型T 的对象可使用== 和!= 操作符比较,与顺序无关。
• T 的== 操作符应该是对称的和可传递的:
– 当t2==t1 时,t1==t2 为真
– 若t1==t2 和t2==t3 为真,则t1==t3 为真
但这是在编译时无法检查的语义约束。
• 要求:
– == 和!= 操作符都受支持,并产生可转换为bool 的值
std::equality_comparable_with<T1, T2>
• 保证类型T1 和T2 的对象可以使用== 和!= 操作符进行比较。
• 要求:
– 对于涉及T1 和/或T2 对象的所有比较,都支持== 和!=,并产生可转换为bool 的相同类
型的值
std::totally_ordered<T>
• 保证类型T 的对象可与==、!=、<、<=、> 和>= 操作符进行比较,以便两个值总是相互等于、
小于或大于对方。
• 这个概念并没有声称类型T 具有所有值的总顺序,即使浮点值没有顺序,但表达式
std::totally_ordered<double> 的结果仍然为true:
1 std::totally_ordered<double> // true
2 std::totally_ordered<std::pair<double, double>> // true
3 std::totally_ordered<std::complex<int>> // false
提供这个概念是为了检查能够对元素进行排序的正式需求,因使用了std::ranges::less,这是排
序算法的默认排序条件。若类型没有所有值的总顺序,排序算法就不会编译失败,支持所有
六个基本比较运算符就足够了。要排序的值应该是全序或弱序,但这是在编译时无法检查的
语义约束。
• 要求:
– 需要满足std::equality_comparable<T>
– 与==、!=、<、<=、> 和>= 操作符的所有比较都会产生可转换为bool 的值
std::totally_ordered_with<T>
• 保证类型T1 和T2 的对象与==、!=、<、<=、> 和>= 操作符具有可比性,以便两个值总是相
互等于、小于或大于对方。
• 要求:
– 对于涉及T1 和/或T2 对象的所有比较,都支持==,!=,<,<=,> 和>= 操作符,并产生
可转换为bool 的相同类型的值
std::three_way_comparable<T>, std::three_way_comparable<T, Cat>
• 保证类型T 的对象与==、!=、<、<=、>、>= 和<=> 操作符可比较(并且至少具有比较类别类
型Cat)。若没有传递Cat,则需要std::partial_ordering。
• 这个概念在头文件<compare> 中定义。
• 注意,这个概念并不包含std::equality_comparable,因为后者要求== 操作符只对两个相等的
对象产生真值。对于弱序或偏序,情况可能不是这样。
• 注意, 这个概念并不暗示和包含std::totally_ordered, 因为后者要求比较类别是
std::strong_ordering 或std::weak_ordering。
• 要求:
– 与==、!=、<、<=、> 和>= 操作符的所有比较都会产生可转换为bool 的值
– 与<=> 操作符的任何比较都会产生一个比较类别(至少是Cat)。
std::three_way_comparable_with<T1, T2>, std::three_way_comparable_with<T1, T2, Cat>
• 保证任意两个T1 和T2 类型的对象都可以与==、!=、<、<=、>、>= 和<=> 操作符进行比较
(并且至少具有比较类别类型Cat)。若没有传递Cat,则需要std::partial_ordering。
• 这个概念在头文件<compare> 中定义。
• 注意,这个概念并不包含std::equality_comparable_with,因为后者要求== 操作符只对两个相
等的对象产生真值。对于弱序或偏序,情况可能并不是这样。
• 注意, 这个概念并不暗示和包含std::totally_ordered_with, 因为后者要求比较类别是
std::strong_ordering 或std::weak_ordering。
• 要求:
– std::three_way_comparable 满足T1 和T2(以及Cat) 的值和公共引用
– 与==、!=、<、<=、> 和>= 操作符的所有比较都会产生可转换为bool 的值
– 与<=> 操作符的任何比较都会产生一个比较类别(至少是Cat)。
– 与T1 和T2 的顺序无关

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git的卸载与安装

目录 一、Git的卸载 二、Git的安装 2.1.1 官网下载 2.1.2 镜像下载 ​编辑 2.2 安装 2.3 检验否安装成功 三、Git使用配置 一、Git的卸载 1.找到程序&#xff0c;卸载程序 2.找到Git&#xff0c;右键卸载 卸载完成&#xff01; 二、Git的安装 2.1.1 官网下载 网址&…

科技赋能电影,互动电影开启电影新格局

近年来&#xff0c;科技赋能电影&#xff0c;让电影越来越精彩&#xff0c;也越来越多元。层出不穷的新技术新类型&#xff0c;不断丰富着电影视听语言的表现形式&#xff0c;也为观众带来更多具有交互性和个性化的观影体验。进昂互动科技在推出全球首部院线互动电影《夜班》之…

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

操作系统:虚拟存储系统

目录 1、外存资源管理 外存空间划分 进程与外存对应关系 2、虚拟页式存储系统 3、 淘汰算法&#xff08;重点&#xff09;P217 最佳淘汰算法&#xff08;OPT&#xff09; 先进先出(FIFO) 最近最少使用算法&#xff08;LRU&#xff09; 最近不用的先淘汰(LNU) 最不经常…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

手机实时提取SIM卡打电话的信令声音--社会价值(一、方案解决了什么问题)

手机实时提取SIM卡打电话的信令声音 --社会价值(一、方案解决了什么问题) 一、前言 这段时间&#xff0c;我们在技术范围之外陷入了一个自证或者说下定义的怪圈&#xff0c;即要怎么样去介绍或者描述&#xff1a;我们是一个什么样的产品。它在当前这个世界上&#xff0c;处于…

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

Devops-蓝鲸篇-01-蓝鲸智云简介

官方社区 蓝鲸智云学习社区&#xff1a;https://bk.tencent.com/s-mart/communities 蓝鲸简介 腾讯蓝鲸智云&#xff0c;简称蓝鲸&#xff0c;是腾讯互动娱乐事业群&#xff08;Interactive Entertainment Group&#xff0c;简称 IEG&#xff09;基于海量异构业务自研的一套…

9. 高效利用Excel设置归档Tag

高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下&#xff0c;一个清晨&#xff0c;语音助手已经为你安排好一天的任务&#xff0c;自动驾驶汽车准时送你上班&#xff0c;智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景&#xff0c;如今正在我们的身边实现。…

Ai编程从零开始部署Node项目接口开发之云服务器ECS安装部署mysql(十四)

云风网 云风笔记 云风知识库 为了体验基本的增删改查功能&#xff0c;用户注册/登录/用户列表查询展示/删除用户等接口开发是必要的&#xff0c;这里采用node项目开发部署。如果想要简便&#xff0c;可以采用宝塔运维面板。这里直接官网下载安装包部署云服务器 一、mysql官网下…

jmeter调整字号无法生效?

调整之前如上图&#xff0c;字体非常小&#xff0c;哪怕我设置的字号是48 查阅了资料&#xff0c;试了几次&#xff0c;解决办法如下&#xff1a; 用编辑器打开jmeter.bat 在echo off的下一行添加以下代码 set JVM_ARGS%JVM_ARGS% -Dswing.plaf.metal.controlFontDialog-20…

使用 mkcert 工具自签发 https 证书并进行本地受信

介绍 mkcert 是一个用于创建本地受信任的 SSL/TLS 证书的简单工具&#xff0c;特别适合开发者在本地环境中使用。它解决了为开发和测试目的创建自签名证书时遇到的信任问题。以下是关于 mkcert 的详细介绍&#xff1a; 特点 易用性&#xff1a;只需一条命令即可生成证书&…

视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况

焚烧作为一种常见的废弃物处理方式&#xff0c;往往会对环境造成严重污染。因此&#xff0c;减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立&#xff0c;各地努力减少因焚烧引发的森林火灾&#xff0c;保护生态环境。 巡察烟火…

C语言:分支结构

C语言&#xff1a;分支结构 分支结构 问题引出 我们在程序设计往往会遇到如下的问题&#xff0c;比如下面的函数的计算 也就是我们是必须要通过一个条件的结果来选择下一步的操作&#xff0c;算法上属于一个分支结构&#xff0c;C语言中实现分支结构主要使用if语句 条件判断…

图像矫正小白指南:从理论到实践的简单实现

一、引言 在日常生活中&#xff0c;使用手机拍全景照片或通过车载摄像头查看倒车影像时&#xff0c;常常会发现画面出现一定程度的变形。例如&#xff0c;建筑物的直线会被拉弯&#xff0c;或者车身轮廓显得不自然。这种现象就是图像畸变&#xff0c;它可能影响美观&#xff0…

【开源】基于SpringBoot框架的读书笔记共享平台 (计算机毕业设计)+万字毕业论文 T029

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…