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

news/2025/2/12 20:04:37/

此页面中列出的具名要求,是 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.ppmy.cn/news/1297883.html

相关文章

QT DAY2 作业

1. 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QMovie> #include <QTextEdit> #include <QDebug> namespace Ui { class MyWidget; }class MyWidget : public QWidget {Q_OBJECTpublic:explicit MyWidget(QWidget *p…

46 WAF绕过-信息收集之反爬虫延时代理池技术

目录 简要本章具体内容和安排缘由简要本课具体内容和讲课思路简要本课简要知识点和具体说明演示案例:Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CC总结&#xff1a; Aliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分析绕过-…

springboot学生成绩管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

uniapp中组件库的Textarea 文本域的丰富使用方法

目录 #平台差异说明 #基本使用 #字数统计 #自动增高 #禁用状态 #下划线模式 #格式化处理 API #List Props #Methods #List Events 文本域此组件满足了可能出现的表单信息补充&#xff0c;编辑等实际逻辑的功能&#xff0c;内置了字数校验等 注意&#xff1a; 由于…

练习-指针笔试题

目录 前言一、一维整型数组1.1 题目一1.2 题目二 二、二维整型数组2.1 题目一2.2 题目二2.3 题目三 三、结构体3.1 题目一&#xff08;32位机器运行&#xff09; 四、字符数组4.1 题目一4.2 题目二 总结 前言 本篇文章记录关于C语言指针笔试题的介绍。 一、一维整型数组 1.1 …

2024 年 API 安全:预测和趋势

随着技术以前所未有的速度不断进步&#xff0c;API&#xff08;应用程序编程接口&#xff09;安全性的复杂性也随之增加。随着 API 在现代应用程序和服务中的激增&#xff0c;组织将需要更好地了解其 API 环境以及 API 给运营带来的风险。 到 2024 年&#xff0c;预计几个关键…

C++推箱子游戏开发

游戏 自动地图生成背景音乐推箱子到目标位置 美工资源 美工资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MZv8pDBXdNDbXxuAAPSM-A **提取码&#xff1a;**2syq 图形库: www.easyx.cn cpp文件 #include "box_man.h" #include <conio.h> #…

18款Visual Studio实用插件(更新)

前言 俗话说的好工欲善其事必先利其器&#xff0c;安装一些Visual Studio实用插件对自己日常的开发和工作效率能够大大的提升&#xff0c;避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件希望对大家有用&#xff0c;大家有更好的插件推荐可在文…