热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

!=运算符的重写候选条件解析

探讨!=运算符在C++中的重写候选条件,分析标准文档中的相关规定及其应用。

C++标准文档中对运算符重写的具体规则进行了详细说明,特别是针对 != 运算符的处理。根据over.match.oper#3.4.3部分的规定,重写候选集的确定遵循以下原则:

1. 对于关系运算符(如 <、>、<=、>=),重写候选集包括表达式 x <=> y 的所有未重写候选。
2. 对于关系和三路比较运算符,还包括参数顺序颠倒的合成候选,即 y <=> x
3. 对于 != 运算符,重写候选集包括表达式 x == y 的所有未重写候选。
4. 对于等式运算符,对于每个未重写的候选 y == x,还包括一个参数顺序颠倒的合成候选。
5. 对于其他运算符,重写候选集为空。

考虑以下示例代码:

#include 
struct Data {
bool operator==(int c) {
return true;
}
};
int main() {
Data d;
bool r = 0 != d; // 应该是非法的
}

尽管从直觉上看,这段代码应该无法编译,因为它尝试使用 Data 类型的对象与整数进行 != 运算,但实际编译器却能成功编译这段代码。这里的关键在于,对于 != 运算符,重写候选集不仅包括 x == y 的所有未重写候选,还包括 y == x 的合成候选。

标准文档进一步指出,对于 != 运算符,重写候选集包括 x == y 的所有成员、非成员和内置候选。这意味着即使 Data 类定义了 operator==,编译器也会考虑 0 == dd == 0 的情况。

此外,标准还规定,如果通过重载决议选择了重写的 operator== 候选者,且该候选者是一个合成候选(即参数顺序颠倒的候选),则 x != y 将被解释为 !(y == x)

因此,对于 0 != d,编译器会首先考虑 0 == dd == 0 的重写候选,如果找到合适的候选者,则 0 != d 将被解释为 !(d == 0)。这解释了为什么代码能够编译成功。


推荐阅读
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 本文探讨了C++中如何正确使用+运算符来处理字符串和数字的拼接问题,分析了为何某些操作有效而另一些则会引发编译错误。 ... [详细]
  • 本文详细探讨了C++中闭包的概念及其实现方式,包括通过重载operator()、使用lambda表达式以及std::bind等方法,旨在帮助开发者更好地理解和运用闭包。 ... [详细]
  • 本文详细探讨了C++中赋值运算符重载函数(operator=)的使用方法和注意事项,结合实例分析了其参数、返回值、调用时机等关键点,并讨论了浅拷贝和深拷贝的区别及其重要性。 ... [详细]
  • 在该问题中,若存在一个节点x满足特定条件,则x所在的强连通分量(SCC)同样满足条件。合法的SCC数量最多为1,因为多个SCC之间具有传递性,理论上应能合并。本文将通过拓扑排序和缩点技术来探讨这一算法的实现。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • 本文介绍了如何计算给定数组中所有非质数元素的总和,并提供了多种编程语言的实现示例。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 在Win10上利用VS2015构建Caffe2环境
    本文详细介绍如何在Windows 10操作系统上通过Visual Studio 2015编译Caffe2深度学习框架的过程。包括必要的软件安装、环境配置以及常见问题的解决方法。 ... [详细]
  • 随着EOS主网的成功启动,众多开发者和投资者对其给予了高度关注。本文旨在介绍如何构建EOS开发环境,包括所需的基本硬件配置、软件安装步骤以及常见问题的解决方案。 ... [详细]
  • http:acm.hdu.edu.cnshowproblem.php?pid1846好几天没出题了,今天终于水了一题巴什博弈题。总结:【一】巴什博弈对象:一堆石子(可延伸 ... [详细]
  • 题意题目大意很简单,很容易找出对应字母的ASCII码值的关系,但是有一点需要注意,请看代码:读字符串必须要用getline ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 按照频率降序打印数字 ... [详细]
  • 题目概述:给定一棵带颜色节点的树,目标是找到一种方法,通过删除某些边使得每个连通分量内的节点颜色相同。需要计算出所有可能的合法边集的数量。使用动态规划的方法,特别是树形DP来解决问题。 ... [详细]
author-avatar
yu2531958135
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有