C++20 比较:关于不明确的反转运算符的警告

2024-06-27

考虑这个有效的 C++17 示例:

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


int main() {
   return A{} == A{};
}

When 使用 -std=c++20 在 clang 中编译它给出 https://godbolt.org/z/QXVEAt:

<source>:7:15: warning: ISO C++20 considers use of overloaded operator '==' (with operand types 'A' and 'A') to be ambiguous despite there being a unique best viable function [-Wambiguous-reversed-operator]

   return A{} == A{};

          ~~~ ^  ~~~

<source>:2:9: note: ambiguity is between a regular call to this operator and a call with the argument order reversed

   bool operator==(const A&);

此警告是否意味着 C++20 不允许使用典型的比较运算符来比较相同类型的两个对象?正确的选择是什么?这种情况预计会在未来的草案中有所改变吗?


此警告是否意味着 C++20 不允许使用典型的比较运算符来比较相同类型的两个对象?正确的选择是什么?这种情况预计会在未来的草案中有所改变吗?

这实际上并不是一个典型的比较运算符,它已经有点错误了 - 因为它只允许const一侧的物体(您的类型A不能满足新的equality_comparable概念,即使没有任何语言变化)。

你必须这样写:

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

这是 C++20 的最终规则。


具体问题是,在 C++20 中,比较运算符添加了重写和反转候选的新概念。所以查找表达式a == b最终也会匹配到像这样的运算符b == a。在典型情况下,这意味着您必须编写更少的运算符,因为我们知道相等是可交换的。

但如果常量不匹配,最终会出现以下两个候选:

bool operator==(/* this*/ A&, A const&); // member function
bool operator==(A const&, /* this*/ A&); // reversed member function

有两个类型的参数A。第一个候选者在第一个参数中更好,第二个候选者在第二个参数中更好。两位候选人都不比另一位更好,因此含糊不清。

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

C++20 比较:关于不明确的反转运算符的警告 的相关文章

  • 将 std::lock_guard 与 try_lock 一起使用

    有什么办法可以告诉我std lock guard打电话try lock代替lock当它获取互斥锁时 我能想到的唯一方法是使用std adopt lock if mutex try lock Handle failure and return
  • static const 和 constexpr 变量有什么区别? [复制]

    这个问题在这里已经有答案了 我明白 一个constexpr variable可以在编译时使用 对于模板 或者例如 static assert 但如果我想在没有 constexpr 的情况下做到这一点 我可以static const 自从 C
  • 如何将组添加到多个内置功能区选项卡 (vsto)?

    这是 VS2010 Office 2010 加载项 我想要的只是添加一个按钮 或按钮组 到多个内置选项卡 例如 我的按钮应该在两个中都可用新邮件消息功能区 and in 新预约丝带 我尝试添加一个新选项卡 在视觉设计器中 但这似乎不起作用
  • 如何反向遍历 C# 集合?

    是否有可能有一个foreach将以相反顺序遍历 Collections 对象的语句 如果不是foreach声明 还有其他方法吗 你可以用普通的for向后循环 如下所示 for int i collection Count 1 i gt 0
  • Qt:将事件发布到 QThread 的正确方法?

    在我的 Qt 应用程序中 我有一个主线程和一个工作线程 工作线程子类QThread并通过处理事件customEvent 这是主线程发送要由工作线程处理的事件的正确方法吗 QThread myWorkerThread QApplication
  • WTL 子窗口事件处理

    我正在开发窗口应用程序 因为我在左侧和右侧有 2 个子窗口 我想分别处理两个窗口的输入事件 如何实现 My code class EditorWindow public DxWindow public CSplitterWindow m v
  • 使用自定义源增强 Iostreams zlib_error

    我正在尝试使用zlib decompressor通过一个解压缩数据istreambuf iterator 我找不到使用输入迭代器作为流的输入的内置方法 如果已经存在 请指出一种方法 所以我写了这个源代码 template
  • 如何使用鼠标指针和键盘快捷键捕获文本?

    我想使用 C 或 java 使用鼠标指针和键盘快捷键从打开的窗口捕获文本 喜欢babylon http babylon com 所以 我需要知道什么以及如何实施 我需要使用哪些库 或者我可以使用 winapi 吗 使用脚本语言创建您想要执行
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • 可以取消链接以读写方式打开的文件

    在我的程序 在 Mac OS X 上 中 我使用以下代码打开该文件 int fd fd open filename O RDWR 删除文件的程序如下 unlink filename 就我而言 我有相同的文件被打开和删除 我观察到以下情况 打
  • 创建新文件夹的“Shell 命名空间”方式是什么?

    显然 这对于 win32 api CreateDirectory 来说是微不足道的 但我正在尝试托管一个 IShellView 并且希望以最面向 shell 的方式来做到这一点 我本以为 IShellFolder 中会有一个 createo
  • 指示 GDB 6.5 使用目标文件中嵌入的源代码

    我一直在努力让GNU gdb 6 5 14在调试时使用嵌入在目标文件中的源代码 而不是扫描某些目录 主要原因是我是为嵌入式平台开发的 并且是交叉编译的 这意味着所有源代码都在我的电脑中 我读到了关于 ggdb3标志 其中包含许多额外信息 包
  • 动态方法的实际例子?

    我想学习动态方法及其使用 C 的实际示例 动态方法和Reflection有什么关系吗 请帮我 我们正在使用动态方法来加速反射 这是我们的反射优化器的代码 只比直接调用慢10 比反射调用快2000倍 public class Reflecti
  • 如何在没有 ADO 包装器的情况下在 C# 中使用 SQLite

    这可能吗 我读过的所有文章都指出 ADO 包装器是必要的 但 SQLite 网站暗示除了 DLL 之外不需要其他任何东西 如果可能的话 我希望那里有代码示例 看这里 http www sqlite org cvstrac wiki p Sq
  • 如何检测任务栏上的右键单击

    我有一个 C 语言的 Windows 窗体应用程序 它以加载对话框开始 正如预期的那样 该应用程序的按钮会显示在 Windows 任务栏中 我想检测可能对该按钮进行的 右键单击 最终 我希望禁用右键单击或只是让加载对话框重新获得焦点 我看到
  • 当我更新具有相同数据类型的另一个列表时列表发生更改

    我的代码看起来像这样 public class Category public string CatId get set public string CatName get set public string SpecId get set
  • 如何在 WinRT 中从 C++ 获取堆栈跟踪?

    我需要从 C 应用程序获取堆栈跟踪 并将其序列化为字符串 以便稍后解析 我在 Windows 上听说过的唯一 API 是 StackWalk64 它似乎不受支持 如何在 Windows 应用商店应用程序中从 C 获取堆栈跟踪 我能够调试复杂
  • 嵌入式控制台日志优化

    不久前我曾发过一篇文章this https stackoverflow com questions 25204389 how to get unique values at preprocessing across files关于SO的问题
  • C# 如何更改 windows.forms.listview 中的网格线颜色

    如何更改 windows forms listview 中的网格线颜色 我认为没有办法在不覆盖 Paint Event 的情况下在列表视图上执行此操作 但是 如果您能够切换到网格视图 您可以这样做 this dataGridView1 Gr
  • 为什么对于某些数组 A,sizeof(A) 在函数内不起作用? [复制]

    这个问题在这里已经有答案了 下列 include

随机推荐

  • 批处理命令在Notepad++中打开某种类型的所有文件

    我有以下批处理命令来打开文件dtd扩大 REM Open all the static content files C Program Files x86 Notepad notepad exe D data folder1 File1 d
  • 创建宏来执行默认初始化

    我有很多重复这个简单样板的方法 id myObject if myObject self myObject myObject class new return myObject 所以我想用一个简单的宏来替换它 define default
  • 在javascript中计算精确的字符\字符串高度

    我正在使用画布 但我想不出任何解决方案 也无法在线找到问题的答案 我有一种字体 其中包含不同尺寸 高度和宽度 的符号 字符 我想从字体中绘制一些字符 符号 并在符号的顶部 向下绘制一些字符 问题是我无法找到一种方法来获得我正在绘制的字符的精
  • Neo4j 匹配多个关系

    如何编写一个查询来获取与集合中所有节点都有关系的节点 例如 START n node people username g node groups groupname A groupname B MATCH n M gt g RETURN n
  • Python 中相当于 C# 中的 FileStream 的是什么?

    我正在尝试在 Python 中复制这段代码 该代码采用以 Base64 编码的文本流并将其逐字节写入 csv 文件 using FileStream localFileStream new FileStream destinationPat
  • 聚合物纸下拉菜单在浏览器中未正确呈现

    我对简单的纸张下拉菜单的渲染 html 遇到问题 列表项并不显示为样式化的 菜单 而只是出现在页面上的项目列表 单击渲染的纸张输入组件 渲染的下拉列表的一部分 确实会为波纹设置动画 但不会为菜单和菜单项的显示 隐藏设置动画 单击列表中的某个
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • 在 Linux 中使用 --digest 选项通过curl 进行“摘要式身份验证”

    我正在尝试在Linux中使用curl更改基于Onvif的相机的日期 我已经在 C 中成功完成了此操作并使用摘要身份验证 但我陷入了这种情况 我正在使用以下命令 curl u admin admin digest http 10 104 37
  • Bash IF:多个条件

    我已经尝试让这件事工作几个小时 但我无法让它工作 if P SFTP a PORT 22 P FTPS PORT 990 a PORT 21 then 有人能帮我吗 我知道多个条件可以这样写 if P SFTP PORT 22 then 但
  • symfony 2 形式的函数 getName 做什么

    这是我的表格类 class CommentType extends AbstractType public function buildForm FormBuilder builder array options builder gt ad
  • 标题的固定高度和更改宽度(HTML 表格)

    我需要确保表格标题的高度是固定的 并且宽度是根据标题单元格内容进行调整的 标题文本最多显示两行 我们如何使用样式来做到这一点 另外 我想确保表行的宽度与标题行的宽度相同 即标题行决定宽度 注 目前 交易部门负责人别名 是按行排列的 它需要分
  • C++ 如何检查文件字节顺序标记以确定它是否是 UTF-8?

    我想知道如何检查文件字节顺序标记以确定它是否是 C 中的 UTF 8 一般来说 你不能 字节顺序标记的存在非常有力地表明您正在读取的文件是 Unicode 如果您需要一个文本文件 那么您收到的前四个字节是 0x00 0x00 0xfe 0x
  • 找不到关联,Rails 3

    class Membership lt ActiveRecord Base belongs to role belongs to user end class User lt ActiveRecord Base has many roles
  • 使用条件变量的 C++ 监视器类/包装器

    我正在尝试创建一个包装类W在 C 中 它是用指向通用对象的指针构造的OBJ 当您致电其中之一时OBJ方法通过W W 包含条件变量cv 发出一个cv wait 打电话之前OBJ方法和一个cv notify when OBJ方法已完成 我已经能
  • 如何避免父ScrollView裁剪内部ScrollView?

    When a horizontal child ScrollView is nested inside a vertical parent ScrollView internal element is clipped by parent S
  • 检查 GitHub 令牌的范围

    我想被动地检查 GitHub 安全令牌的权限 范围 而不将某些内容推送到存储库中 我尝试了以下命令 我替换了 your username 你的访问令牌和我的存储库的 URL 但它显示一个错误 curl 3 URL 使用错误 非法格式或缺少
  • 多线程:您在什么时候创建了太多线程?

    我正在开发一个多线程应用程序 该应用程序最初是单线程 后来扩展到多线程以实现性能提升 我有一个主线程 它将工作分成更小的块 并将其卸载到处理这些块的工作线程 此部分使用信号量进行控制 以在任何时间仅允许 X 个工作线程 工作线程生成数据块
  • lua找不到模块插座

    我正在尝试使用 lua 从 nginx 访问 redis 值 当我在命令行上执行 lua 文件时 一切正常 我可以读取值并将值写入 redis 但是当我尝试通过访问写入 access by lua 指令的位置来从 nginx 执行相同的文件
  • Bootstrap 4 行布局没有响应

    我正在使用 Bootstrap 4 在 MEAN 堆栈上为新闻文章布局创建一个 html 模板 但这应该不重要 对于这种总体布局的要求是 一篇 特色 文章位于其自己的列中 而其他 8 篇文章位于另一列中的两行中 当在较小的屏幕或移动设备上查
  • C++20 比较:关于不明确的反转运算符的警告

    考虑这个有效的 C 17 示例 struct A bool operator const A int main return A A When 使用 std c 20 在 clang 中编译它给出 https godbolt org z Q