C++ 具名要求-全库范围的概念 - 一种等价关系(operator==)- 是一种严格弱序关系(operator< )

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

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

全库范围的概念

operator== 是一种等价关系

C++ 具名要求: EqualityComparable

类型必须能使用 == 运算符且结果应当具有标准语义。

要求

以下情况下,类型 T 满足可相等比较 (EqualityComparable)

给定

  • Tconst T 类型的表达式 abc

下列表达式必须合法且拥有其指定的效果

表达式返回类型要求
a == b可隐式转换为 bool建立一种等价关系,即满足下列性质:
  • 对于 a 的所有值,a == a 产生 true;
  • 若 a == b,则 b == a;
  • 若 a == b 且 b == c,则 a == c。

注解

为满足此要求,没有内建比较运算符的类型必须提供用户定义的 operator==。

对于既可相等比较 (EqualityComparable)可小于比较 (LessThanComparable) 的类型, C++ 标准库对相等(即表达式 a == b 的值)和等价(即表达式 !(a < b) && !(b < a) 的值)间做出区别。

operator< 是一种严格弱序关系

C++ 具名要求: LessThanComparable

类型必须能使用 < 运算符且结果应当具有标准语义。

要求

以下情况下,类型 T 满足LessThanComparable:

给定

  • Tconst T 类型的表达式 abc

下列表达式必须合法并拥有其指定的效果

表达式返回值要求
a < b可隐式转换为 bool建立严格弱序关系,即具有下列属性:
  • 对于所有 a,!(a < a)
  • 若 a < b 则 !(b < a)
  • 若 a < b 且 b < c 则 a < c
  • 定义 equiv(a, b) 为 !(a < b) && !(b < a),若 equiv(a, b) 且 equiv(b, c),则 equiv(a, c)

注解

为满足此要求,没有内建比较运算符的类型必须提供用户定义的 operator<。

对于既可相等比较 (EqualityComparable) 又可小于比较 (LessThanComparable) 的类型,C++ 标准库在相等(即表达式 a == b 的值)和等价(即表达式 !(a < b) && !(b < a) 的值)间做出区别。

支持空值的指针式类型

C++ 具名要求: NullablePointer (C++11 起)

指定该类型是能与 std::nullptr_t 对象进行比较的指针式类型。

要求

类型必须满足所有下列要求:

  • 可相等比较 (EqualityComparable)
  • 可默认构造 (DefaultConstructible)
  • 可复制构造 (CopyConstructible)
  • 可复制赋值 (CopyAssignable)
  • 可析构 (Destructible)

此外,此类型的一个值初始化的对象必须产生该类型的空值(null)。空值必须仅与自身等价。该类型的默认初始化可拥有不确定值。

此类型必须可按语境转换成 bool。若其值等价于其空值则此转换的效果为 false,否则为 true。

此类型进行的操作均不可抛异常。

此类型必须满足下列额外的表达式,给定该类型的两个值 pq,以及 np 是 std::nullptr_t 类型的值(可有 const 限定):

表达式效果
Type p(np);

Type p = np;

之后 p 等价于 nullptr。
Type(np)等价于 nullptr 的临时对象。
p = np必须返回 Type&,而且之后 p 等价于 nullptr。
p != q必须返回能按语境转换成 bool 的值。效果为 !(p == q)
p == np

np == p

必须返回能按语境转换成 bool 的值。效果为 (p == Type())
p != np

np != p

必须返回能按语境转换成 bool 的值。效果为 !(p == np)

注解

注意,对可空指针 (NullablePointer) 类型不要求解引用(operator*operator->)。满足这些要求的最小化类型是

class handle
{int id;
public:handle(std::nullptr_t = nullptr) : id(0) { }explicit operator bool(){return id != 0;}friend bool operator ==(handle l, handle r){return l.id == r.id;}friend bool operator !=(handle l, handle r){return !(l == r);}
};

标准库

下列类型必须满足可空指针 (NullablePointer)

  • 每个分配器 (Allocator) 类型 X 的成员类型 X::pointerX::const_pointerX::void_pointerX::const_void_pointer
  • std::unique_ptr 的成员类型 X::pointer
  • 类型 std::exception_ptr

调用示例

#include <iostream>
#include <string>
#include <iomanip>
#include <complex>
#include <tuple>
#include <typeinfo>struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}//类型必须能使用 == 运算符且结果应当具有标准语义。bool operator ==(const Cell &cell) const{return x == cell.x && y == cell.y;}bool operator !=(const Cell &cell) const{// return x != cell.x && y != cell.y;return !(*this == cell);}//类型必须能使用 < 运算符且结果应当具有标准语义。bool operator <(const Cell &cell) const{if (x < cell.x){return true;}return y < cell.y;}
};class handle
{int id;
public:handle(std::nullptr_t = nullptr) : id(0) { }explicit operator bool(){return id != 0;}friend bool operator ==(handle l, handle r){return l.id == r.id;}friend bool operator !=(handle l, handle r){return !(l == r);}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{std::cout << std::boolalpha;Cell cell1 = {101, 102};Cell cell2 = {101, 102};Cell cell3 = {201, 202};std::cout << cell1 << " == " << cell2 << "  :   "<< (cell1 == cell2) << std::endl;std::cout << cell1 << " != " << cell2 << "  :   "<< (cell1 != cell2) << std::endl;std::cout << cell1 << " == " << cell3 << "  :   "<< (cell1 == cell3) << std::endl;std::cout << cell1 << " != " << cell3 << "  :   "<< (cell1 != cell3) << std::endl;std::cout << cell1 << " <  " << cell2 << "  :   "<< (cell1 < cell2) << std::endl;std::cout << "!(" << cell1 << " <  " << cell2 << ")  :   "<< !(cell1 < cell2) << std::endl;std::cout << cell1 << " < " << cell3 << "  :   "<< (cell1 < cell3) << std::endl;std::cout << "!(" << cell1 << " < " << cell3 << ")  :   "<< !(cell1 < cell3) << std::endl;return 0;
}

输出

{101,102} == {101,102}  :   true
{101,102} != {101,102}  :   false
{101,102} == {201,202}  :   false
{101,102} != {201,202}  :   true
{101,102} <  {101,102}  :   false
!({101,102} <  {101,102})  :   true
{101,102} < {201,202}  :   true
!({101,102} < {201,202})  :   false

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

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

相关文章

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台&#xff0c;通过可视化进行应用程序开发的方法&#xff0c;让不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发&#xff0c;实现了四个标准的隔离级别&#xff0c;默认为可重复读&#xff0c;并且通过间隙锁&#xff08;next-key locking&#xff09;策略防止幻读&#xff08;查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战12&#xff08;好友关注、Feed流&#xff08;关注推送&#xff09;、滚动分页查…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的校园预点餐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

案例分享:游戏行业各岗位的KPI绩效指标制定

在游戏行业中&#xff0c;岗位种类繁多&#xff0c;每个岗位的职责和要求都有所不同。因此&#xff0c;制定合理的KPI&#xff08;关键绩效指标&#xff09;是确保团队高效运作的关键。 在竞争激烈的市场环境中&#xff0c;合理的KPI不仅有助于员工明确工作方向&#xff0c;还…

Pandas实战100例 | 案例 37: 从长格式转换为宽格式

案例 37: 从长格式转换为宽格式 知识点讲解 数据格式转换是数据处理中的一个常见需求。Pandas 提供了将数据从长格式&#xff08;每行是一个观测值&#xff09;转换为宽格式&#xff08;每个观测值成为一列&#xff09;的功能。 长格式转宽格式: 使用 pivot 方法可以将数据从…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…

使用ElementUI的el-tab+vxe-table表格+复选框选择

效果&#xff1a; 功能&#xff1a;首先进来是全部清空的状态的 点击左边选择不同项右边会实时发送接口获取数据填充表格 复选的内容可以保留显示&#xff0c;比如A的1勾选后切换到B再切换回来A的1仍然是勾选状态 说实话官网的setCheckboxRow方法我实现不了&#xff0c;这里…

2024年华夏银行总行社会招聘公告

信息科技部自动化测试与开发类岗  工作地点&#xff1a;北京市 学历要求&#xff1a;本科及以上 工作职责 1、持续推进自动化测试的开展&#xff0c;提升自动化测试覆盖率,包括方案设计、测试分析、测试执行和总结等。 2、负责自动化测试工具和框架搭建&#xff0c;根据…

C语言实现单向循环链表

1.C语言实现 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 定义一个节点类 typedef struct Node {int data;// 数据域struct Node* next;// 指针域 }Node; // 定义初始化链表方法 Node* initList() {Node* list (Node*)malloc(sizeof(…

【数据库原理】(26)数据库并发控制

并发控制是数据库管理系统&#xff08;DBMS&#xff09;的核心功能之一。它确保在多个用户并行访问数据库时&#xff0c;数据库的一致性和完整性得到维护。 一.事务概述 1. 事务的定义 事务是数据库中基本的逻辑工作单位&#xff0c;由一系列操作组成&#xff0c;这些操作要…

CSAPP阅读笔记-信息的表示和处理

信息的表示和处理 包括整数、浮点数的存储格式、计算中可能存在的问题等 信息存储 大多数计算机使用8位的块&#xff0c;或者字节(byte)&#xff0c;作为最小的可寻址的内存单位&#xff0c;而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c…

java实现调用http请求的几种常见方式

概述 在实际开发过程中&#xff0c;我们经常需要调用对方提供的接口或测试自己写的接口是否合适。 很多项目都会封装规定好本身项目的接口规范&#xff0c;所以大多数需要去调用对方提供的接口或第三方接口&#xff08;短信、天气等&#xff09;。 在Java项目中调用第三方接口…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

Linux从入门到精通(第14章 传输文件)

如何在Ubuntu上安装配置NFS_ubuntu 安装nfs-CSDN博客 遇到某些问题&#xff1a; 1、无权限更改文件&#xff1a;sudo -s 2、sudo ifconfig无法识别&#xff1a;sudo apt-get install net-tools 最后的效果是&#xff1a; 在服务端的机器上&#xff1a;rootsword:/nfs_shar…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

基于SSM+JSP的订餐管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

金融疆界:在线支付系统渠道网关的创新设计(一)

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;11.1&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 整个渠道网关的内容预计会分成5篇来讲&#xff1a;1&#xff09;定位、术语、概要设计。2&#xff09;领域模型、状态机设计。3…