C++ 具名要求-全库范围的概念 - (Swappable) - (ValueSwappable)

此页面中列出的具名要求,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。

某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编译器诊断。

全库范围的概念

可用无限定的非成员函数调用 swap() 进行交换的类型

C++ 具名要求: Swappable

在 std::swap 与用户定义 swap() 均可见的语境中,此类型的任何左值或右值能与某个其他类型的任何左值或右值,可以用非限定函数调用 swap() 来进行交换。

要求

若对于任意 U 类型的对象 u 和任意 T 类型的对象 t,满足以下情况,则类型 U 与类型 T 可交换:

表达式要求语义
#include <utility>

using std::swap;
swap(u, t);

调用后,t 的值是 u 在调用前保有的值,而 u 的值是 t 在调用前保有的值。调用名为 swap() 的函数,它是在由实参依赖查找所找到的所有具有这个名字的函数,和定义于头文件 <utility> 中的两个 std::swap 模板中,由重载决议所找到的函数。
#include <utility>

using std::swap;
swap(t, u);

同上同上

许多标准库函数(例如许多算法)期待其实参满足可交换 (Swappable) ,这意味着每当标准库进行交换时,都使用等价于 using std::swap; swap(t, u); 的写法。

典型的实现进行二者之一

1) 在外围命名空间中定义非成员 swap,若要求访问非公开数据成员,则它可转发到成员 swap

2) 于类中定义友元函数(此方法对于除 ADL 之外的名字查找隐藏了类特有的 swap)

注解

标准库进行交换时是否实际包含 <utility> 是未指明的,因此用户提供的 swap() 不应当期待它已被包含。

解引用为某种可交换 (Swappable) 类型的遗留迭代器 (LegacyIterator)

C++ 具名要求: ValueSwappable

此类型的两个对象可以解引用,且在 std::swap 和用户定义 swap() 均可见的语境中,其结果值可以用无限定的函数调用 swap() 进行交换。

要求

以下情况下,类型 T 为值可交换 (ValueSwappable) :

1) 类型 T 满足遗留迭代器 (LegacyIterator) 要求

2) 对任何 T 类型的可解引用对象 x(即并非尾迭代器的值),*x 满足可交换 (Swappable) 要求。

许多标准库函数均期待其实参满足值可交换 (ValueSwappable) ,这意味着凡在标准库进行交换时,它都使用 using std::swap; swap(*iter1, *iter2); 的等价物。

调用示例

#include <iostream>
#include <vector>class IntVector
{std::vector<int> v;IntVector& operator=(IntVector) = delete; // 不可赋值
public:IntVector(const std::vector<int> &t): v(t){}void swap(IntVector& other){v.swap(other.v);}void printf(){for (int iV : v){std::cout << iV << " ";}}
};void swap(IntVector& v1, IntVector& v2)
{v1.swap(v2);
}int main()
{IntVector v1({1, 2, 3, 4, 5});IntVector v2({6, 7, 8, 9, 0});std::cout << "v1:   ";v1.printf();std::cout << std::endl;std::cout << "v2:   ";v2.printf();std::cout << std::endl;
//  std::swap(v1, v2); // 编译器错误!std::swap 要求可移动赋值 (MoveAssignable)std::iter_swap(&v1, &v2); // OK:标准库调用无限定的 swap()std::cout << std::endl;std::cout << "after iter_swap" << std::endl;std::cout << std::endl;std::cout << "v1:   ";v1.printf();std::cout << std::endl;std::cout << "v2:   ";v2.printf();std::cout << std::endl;IntVector* p1 = &v1;IntVector* p2 = &v2; // IntVector* 为值可交换 (ValueSwappable)std::iter_swap(p1, p2); // OK:iter_swap 要求值可交换 (ValueSwappable)//  std::swap(v1, v2); // 编译器错误!std::swap 要求可移动赋值 (MoveAssignable)std::cout << std::endl;std::cout << "after iter_swap" << std::endl;std::cout << std::endl;std::cout << "v1:   ";v1.printf();std::cout << std::endl;std::cout << "v2:   ";v2.printf();std::cout << std::endl;return 0;
}

输出

v1:   1 2 3 4 5
v2:   6 7 8 9 0after iter_swapv1:   6 7 8 9 0
v2:   1 2 3 4 5after iter_swapv1:   1 2 3 4 5
v2:   6 7 8 9 0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv-4.8.0编译及使用

1 编译 opencv的编译总体来说比较简单&#xff0c;但必须记住一点&#xff1a;opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0&#xff0c;opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后&#xff0c;默认看到的是git分支&…

NAS搭建NextCloud集成OnlyOffice

1、安装NextCloud&#xff08;如果总是中断就换个镜像源&#xff09; 2、创建容器 如果需要穿透选HOST 端口必须80 读写必须开 3、启动容器并配置&#xff0c;看图。 启动看日志&#xff0c;等启动完成再访问。首次启动大约5-10分钟左右。 成功后&#xff0c;我们正常进行安装…

学习selenium+python使用 XPath 表达式来实现找到目标元素时智能封装等待,执行测试代码启动Chrome浏览器后,地址栏只显示data;

背景 学习使用 XPath 表达式来实现找到目标元素时智能封装等待执行测试代码启动Chrome浏览器后&#xff0c;地址栏只显示data&#xff1b; 代码如下 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from …

6.2 声音编辑工具GoldWave5简介(5)

6.2.4录制声音 利用Windows自带的“录音机”录制声音时&#xff0c;只能录制最大时长为1分钟的声音&#xff0c;而利用GoldWave5&#xff0c;可以录制时长长达277小时以上的声音&#xff0c;而且&#xff0c;录制完成后&#xff0c;还可以很方便地对声音进行处理、转换等操作。…

由jar包冲突导致的logback日志不输出

最近接手一个厂商移交的项目&#xff0c;发现后管子系统不打印日志。 项目使用的logback 本地断点调试发现logback-classic jar冲突导致 打出的war中没有 相关的jar 解决方法&#xff1a; 去除pom 文件中多余的 logback-classic 应用&#xff0c;只保留最新版本的。 重新打…

记录用python封装的第一个小程序

前言 我要封装的是前段时间复现的一个视频融合拼接的程序&#xff0c;现在我打算将他封装成exe程序&#xff0c;我在这里只记录一下我封装的过程&#xff0c;使用的是pyinstaller&#xff0c;具体的封装知识我就不多说了&#xff0c;可以参考我另一篇博客&#xff1a;将Python…

NLP技术在搜索推荐场景中的应用

NLP技术在搜索推荐中的应用非常广泛&#xff0c;例如在搜索广告的CTR预估模型中&#xff0c;NLP技术可以从语义角度提取一些对CTR预测有效的信息&#xff1b;在搜索场景中&#xff0c;也经常需要使用NLP技术确定展现的物料与搜索query的相关性&#xff0c;过滤掉相关性较差的物…

HashMap 为什么线程不安全?

如果你现在需要准备面试&#xff0c;可以关注我的公众号&#xff1a;”Tom聊架构“&#xff0c;回复暗号&#xff1a;”578“&#xff0c;领取一份我整理的50W字面试宝典&#xff0c;可以帮助你提高80%的面试通过率&#xff0c;价值很高&#xff01;&#xff01; JDK1.7 及之前…

函数指针和回调函数 以及指针函数

函数指针&#xff08;Function Pointer&#xff09;&#xff1a; 定义&#xff1a; 函数指针是指向函数的指针&#xff0c;它存储了函数的地址。函数的二制制代码存放在内存四区中的代码段&#xff0c;函数的地址它在内存中的开始地址。如果把函数的地址作为参数&#xff0c;就…

力扣2182.构造限制重复的字符串

思路&#xff1a;先记录每个字符的出现次数&#xff0c;构建一个新字符串&#xff0c;从尾取字符&#xff0c;每取一个该字符个数-1&#xff0c;若该字符已经取到有repeatLimit个&#xff0c;则递归取次大的字符&#xff0c;并对应字符个数-1&#xff0c;若没有次大字符了&…

Elasticsearch基础篇(七):分片大小修改和路由分配规则

Elasticsearch基础篇(七)&#xff1a;分片大小修改和路由分配规则1. 分片1.1 主分片&#xff08;Primary Shard&#xff09;1.2 副本分片&#xff08;Replica Shard&#xff09;1.3 分片路由&#xff08;Routing Shard&#xff09; 2. 分片分配的基本策略3. 分片写入验证3.1 数…

2024年前端最新面试题-vue3(持续更新中)

文章目录 前言正文什么是 MVVC什么是 MVVM什么是 SPA什么是SFC为什么 data 选项是一个函数Vue 组件通讯&#xff08;传值&#xff09;有哪些方式Vue 的生命周期方法有哪些如何理解 Vue 的单项数据流如何理解 Vue 的双向数据绑定Vue3的响应式原理是什么介绍一下 Vue 的虚拟 DOM介…

设计模式-- 3.适配器模式

适配器模式 将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 角色和职责 请求者&#xff08;client&#xff09;&#xff1a;客户端角色,需要使用适配器的对象&#xff0c;不需要关心适配器内部的实现&#xff0c;…

IEEE论文LaTeX模板解析(十一)| 尾页栏目均衡(Last Page Column Equalization)

本文收录于专栏&#xff1a;IEEE论文LaTeX模板解析&#xff0c;本专栏将会围绕IEEE论文LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 IEEE 在最后一页平衡了各栏的长度。这种平衡是粗略的&#xff0c;因为参考文献或 IEEE 传记条目通常不会断开&#xff0c;…

Origin 或 Referer 的关系和区别

Origin 或 Referer 的关系和区别 Origin 和 Referer 都可以服务端用来做来源验证&#xff0c;来防止 csrf 攻击&#xff0c;都是浏览器自动带在请求头的但是&#xff0c;可以通过 Referrer Policy 来禁止请求携带 referer&#xff0c;【请求头增加字段 Referrer-Policy: no-ref…

TF-IDF(词频-逆文档频率)

文章目录 高频词只能说明词汇在评论中出现的频率高&#xff0c;但并不能说明这个词汇的重要性。利用关键词提取可以弥补这一不足&#xff0c;关键词提取是一种自动化的文本处理技术&#xff0c;它可以从一篇文章中自动抽取出最能代表文章主题和内容的若干个词语或短语。通常情况…

常用的检测数据异常值方式,以及异常数据如何处理!!

清除数据异常值 1.箱线图检测数据异常值方法2.3σ原则检测数据异常值方法3. 异常数据处理方式&#xff1a;总结&#xff08;小白看看就行&#xff09; 1.箱线图检测数据异常值方法 箱线图检测&#xff1a;箱线图是一种常用的异常值检测方法&#xff0c;它以数据的分位数为基础…

常见的加密算法

加密算法 AES 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥&#xff0c;具体的加密流程如下图&#xff1a; RSA RSA 加密算法是一种典型的非对称加密算法&am…

正则表达式2 常见模式

继上次的正则表达式速攻1/2-CSDN博客 还有一些常见的匹配模式可以直接使用 电子邮箱 xxxxxx.域名 的情况 \b[A-Za-z0-9._%-][A-Za-z0-9.-]\.[A-Z|a-z]{2,}\bhttp或者https网址 的情况 http[s]?://(?:[a-zA-Z]|[0-9]|[$-_.&]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F…

DRL入门

目录 1. DRL的核心概念 2. 算法分类 1、免模型学习和有模型学习&#xff08;理不理解所处的环境&#xff09; 2、基于策略&#xff08;概率&#xff09;的方法和基于价值的方法 3、回合更新和单步更新&#xff1a; 4、在线学习和离线学习 文献 1. Deep Reinforcement L…