仅在与类的其他对象进行比较时,是否有任何理由不将运算符==重载为成员?

2023-11-22

我一直在互联网上寻找答案,但找不到任何答案。给出的唯一原因似乎与不同类型的对象进行比较有关(例如MyClass == int)。但最常见的用例是将类实例与同一类的另一个实例进行比较,而不是与任何不相关的类型进行比较。

换句话说,我确实理解以下问题:

struct A {
    bool operator==(int b);
};

但我找不到任何在最明显的用例中不使用成员函数的充分理由:

struct A {
    bool operator==(const A&);
};

  • 最规范的重复运算符重载的基本规则和习惯用法是什么?根据经验,“将二元运算符重载为非成员”。
  • 运算符重载:成员函数与非成员函数?给出了上面提到的例子 -如果您要将此运算符与另一个类/基元类型的实例一起使用...
  • Cpp核心指南有一个模糊的解释”如果使用成员函数,则需要两个”,我认为这适用于与不同类型的对象进行比较。
  • 为什么operator提到“非成员函数通过隐式转换发挥更好的作用",但左操作数似乎又不是该类的实例。

另一方面,成员过多似乎有几个积极的方面:

  • 无需与函数交友或为成员提供吸气剂
  • 它始终可供班级用户使用(尽管这也可能是缺点)
  • 查找没有问题(由于某种原因,这在我们的 GoogleTests 中似乎很常见)

正在超载operator==作为非成员函数只是一个约定,以使其与其他类中可能的重载保持一致?或者还有其他理由使其成为非会员吗?


好吧,在你的问题中,你确实忘记了const限定成员函数,写起来会比较困难bool operator==(A&, const A&);意外地。

如果你有一个隐式构造函数,一个隐式转换为A或基类operator==如果优先级较高,则成员函数如果在左侧则无法工作,但如果在右侧则可以。尽管大多数时候隐式转换不是一个好主意,但继承可能会导致问题。

struct A {
    A(int);  // Implicit constructor
    A();

    bool operator==(const A&) const;
};

struct B : A {
    bool operator==(const B&) const;
};

void test() {
    A a;
    B b;
    // 1 == a;  // Doesn't work
    a == 1;
    // b == a;  // Doesn't work; Picks `B::operator==(const B&) const;`
    a == b;  // Picks `A::operator==(const A&) const`, converting `b` to an `A&`.
    // Equality is no longer symmetric as expected
}

未来,随着 C++20operator<=>,您很可能总是将其实现为成员函数(即auto operator<=>(const T&) const = default;),因此我们知道该指南可能会发生变化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅在与类的其他对象进行比较时,是否有任何理由不将运算符==重载为成员? 的相关文章

  • 如何防止 Json.NET 将枚举转换为字符串?

    下面的课 public class RequestSections RequestBase public RequestSections Command c Dictionary
  • 有没有办法为向量采用内存资源?

    我已经开始在我的项目中使用 pmr allocators 并且我已经看到使用它们带来了很多性能提升和优势 我使用的分配器与我在下面的简单示例中展示的非常相似 include
  • 哪些 iomanip 操纵器具有“粘性”?

    我最近在创建一个stringstream由于我错误地假设std setw 会影响每次插入的字符串流 直到我明确更改它 然而 插入后它总是被取消设置 With timestruct with value of Oct 7 9 04 AM st
  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • 如何从c++调用python

    我是Python新手 我尝试像这样从 C 调用 python 脚本 在 Raspberry Pi 中 std string pythonCommand python Callee py a b int res system pythonCo
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • MSBuild 将动态生成的文件复制为项目依赖项的一部分

    我有一个自定义 msbuild 任务 它正在生成一些输出文件到 ProjectA 的输出目录 TargetDir 当前的代码是这样的
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • CS0246 找不到类型或命名空间名称“ErrorViewModel”(您是否缺少 using 指令或程序集引用?)

    我收到 CS0246 错误代码 我正在做一个 MVC net core 项目 我正在将 Razor 合并到我的 C 代码中 我在进行构建时收到此错误 我在最后一行收到错误 有人能帮我解决这个问题吗 global Microsoft AspN
  • XPath 选择具有特定属性值的元素?

    我在使用 XPath 选择节点时遇到问题 我将展示一个示例 由于实际数据量很大 xml 文件被缩短了 这是 XML 的子集
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E

随机推荐

  • Django 中间件错误 - 中间件已更改为 1.7

    每当我使用 Django 项目运行本地服务器时 我都会收到一条警告和一条错误消息 指出在 Django 1 7 中 全局中间件类已更改 即使我使用的是 1 8 我的博客 位于http 127 0 0 1 8000 加载正常 但是当我尝试加载
  • 如何在镜头式单板库中为更高种类的类型实现孔和上下文?

    安德拉斯 科瓦奇提出了这个问题回应之前问题的答案 在镜头式单板库中 用于存储各种类型 gt 基于班级 class Uniplate1 f where uniplate1 Applicative m gt f a gt forall b f
  • 如何反转包含代理对的字符串

    我写了这个方法来反转字符串 public string Reverse string s if string IsNullOrEmpty s return s TextElementEnumerator enumerator StringI
  • 在 Ruby 中提取字符串中的所有 url

    我有一些文本内容 其中包含 URL 列表 我正在尝试抓取所有 URL 并将它们放入一个数组中 我有这个代码 content Here is the list of URLs http www google com http www goog
  • 将 Unix 时间戳转换为无时区时间戳

    如何将 Unix 时间戳 或纪元时间 转换为 PostgreSQLtimestamp without time zone 例如 1481294792应该转换为2016 12 09 14 46 32 I tried SELECT to tim
  • Ruby:比较级之间有什么区别:“||”和“或”[重复]

    这个问题在这里已经有答案了 可能的重复 Ruby 之间的区别和 或 使用红宝石 and or 是非常常见的做法 因此了解两者之间的区别很重要 因为不幸的是我不确定 首先我的问题是以下假设是否正确 EX1 if variable 1 vari
  • 返回值 javascript UIWebView

    我正在尝试获取 javascript 函数的返回值 例如 return hello 与 iPhone SDK 在 OS X 上的 WebView 方法 stringByEvaluatingJavaScriptFromString返回一个包含
  • Swagger UI 显示驼峰命名法参数而不是 PascalCase

    我在 Asp Net Core 3 1 API 中使用 NewtonSoft json 和 Swashbuckle AspNetCore 版本 5 3 3 默认情况下 在 Asp Net Web API 中 2 个输入和输出参数的大小写为
  • 在 C 中为 Fortran 数组分配内存

    我是 Fortran 编程新手 我有一个 3 维数组 声明如下 REAL 4 DIMENSION ALLOCATABLE a1 我想通过引用 C 或 C 函数来传递数组 并在 C 中而不是在 Fortran 中分配内存 是否有可能或者我对
  • Dart 中的 Object 语法意味着什么?

    在下面的代码示例中 从颤振文档 class RandomWords extends StatefulWidget override createState gt RandomWordsState class RandomWordsState
  • 在 WPF 中显示 RichTextBox 中的行号

    我找到了一个例子 如何显示行号RichTextBox在 Windows 窗体中 http www codeproject com Articles 38858 Line Numbers for RichText Control in C 有
  • R Shiny 中的环境

    At http shiny rstudio com articles scoping html闪亮范围的规则得到了很好的解释 有 3 个相互嵌套的环境或级别 函数内 会话内和所有会话内可用的对象 使用 如果我在会话中定义变量但想在函数中更改
  • 登录后重新加载 AntiForgeryToken

    在同一页面的另一个视图中成功登录后 我需要在视图中的表单中重新加载 AntiForgeryToken 我可以通过 jQuery 使用结果登录页面中的新密钥在表单输入 Html AntiForgeryToken 密钥中进行更新吗 如果是 这是
  • 用于 SRT 字幕的 Java API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有SRT字幕的Java API 实际的SRT解析是通过Java能够操作的正则表达式来执行的 实际的正则表达式是 protected static
  • 使用 allauth 绕过注册表单

    有谁知道在 django allauth 中使用社交帐户时如何绕过注册页面 我已经与 Google 合作进行身份验证 但是当用户接受 Google 的请求时 它会重定向到一个页面 要求他们输入电子邮件地址 然后才能登录 但它肯定会从 Goo
  • SqlCommand.Prepare 方法要求所有参数都具有显式设置的类型

    我的 WCF Web 服务中有以下代码片段 它根据提供的字典值的格式构建一组 where 条件 public static Dictionary
  • SQL Server CLR 线程

    我一直在与 SQL Server CLR 存储过程作斗争 背景 我们使用的是 SQL Server 2014 并且已经实现了一个 CLR 存储过程来调用客户的 Web 服务 线程最初用于不减慢 SQL Server CLR 主线程的速度 尽
  • Django 中的长轮询

    我在 Django 应用程序中使用一种长轮询 以便在操作进行时向客户端返回有关长操作的状态消息 我通过在视图函数中返回一个 HttpResponse 对象来实现此目的 该对象是使用返回字符串的迭代器初始化的 这一切都很好 但是迭代器函数变得
  • mongodb通过多个数组项查找

    如果我有这样的记录 text text goes here words text goes here 如何在 MongoDB 中匹配多个单词 当匹配单个单词时我可以这样做 db find words text 但是当我尝试对多个单词执行此操
  • 仅在与类的其他对象进行比较时,是否有任何理由不将运算符==重载为成员?

    我一直在互联网上寻找答案 但找不到任何答案 给出的唯一原因似乎与不同类型的对象进行比较有关 例如MyClass int 但最常见的用例是将类实例与同一类的另一个实例进行比较 而不是与任何不相关的类型进行比较 换句话说 我确实理解以下问题 s