运算符 >= 重载的奇怪行为

2023-12-19

我在 C++ 中的运算符重载中遇到了奇怪的行为。我有一个类,我需要检查它的内容是否大于或等于 long double。我重载了 >= 运算符来进行此检查,我的声明如下:

bool MyClass::operator>=(long double value) const;

我不得不说,我的班级还有一个强制转换为长双精度运算符,它仅在某些条件下才无例外地工作。 现在,当我使用此运算符时,编译器抱怨运算符 >= 的使用不明确,替代方案是:

  • Mine.
  • 内置的operator>=(long double, int).

现在,我如何强制程序使用我的运算符?


2015年更新:或者,如果您想使用(double)obj语法代替obj.to_double()语法,制作转换函数explicit通过在其前面加上该关键字作为前缀。然后您需要显式强制转换才能触发转换。就我个人而言,我更喜欢.to_double语法,除非转换为bool因为在这种情况下,转换被使用if(obj)即使是explicit,这比if(obj.to_bool())在我看来。


删除转换运算符。就会一路带来麻烦。有一个类似的功能

to_double()

或者类似的返回双精度值并显式调用该函数以获取双精度值。

对于手头的问题,有这样的问题:

obj >= 10

考虑一下这个表达。内置运算符使用转换运算符 long double() 通过用户定义的类型转换序列来匹配第一个参数。但是您的函数通过从 int 到 long double (整数到浮点转换)的标准转换序列来匹配第二个参数。当有两个参数的转换,但不是至少有一个参数可以更好地转换,而其余参数对于一次调用没有转换得更差时,它总是不明确的。在您的情况下,内置函数与第二个参数匹配得更好,但第一个参数匹配得更差,但是您的函数与第一个参数匹配得更好,但第二个参数匹配得更差。

这很令人困惑,所以这里有一些例子(从 char 到 int 的转换称为促销,这比从 char 到 int 以外的转换更好,这称为转换):

void f(int, int);
void f(long, long);
f('a', 'a');

调用第一个版本。因为第一个的所有参数都可以更好地转换。同样,以下仍将调用第一个:

void f(int, long);
void f(long, long);
f('a', 'a');

因为第一个可以转换的比较好,第二个不可以转换的比较差。但下面的是模糊的:

void f(char, long);
void f(int, char);
f('a', 'a'); // ambiguous

这个例子就更有趣了。第一个版本通过完全匹配接受第一个参数。第二个版本通过完全匹配接受第二个参数。但这两个版本至少都没有同样好地接受他们的其他论点。第一个版本需要对其第二个参数进行转换,而第二个版本需要对其参数进行提升。因此,即使升级比转换更好,对第二个版本的调用也会失败。

这和你上面的情况非常相似。即使标准转换序列(从 int/float/double 转换为 long double)是better与用户定义的转换序列(从 MyClass 转换为 long double)相比,您的运算符版本未被选择,因为您的其他参数(long double)需要从参数进行转换,这比内置运算符对该参数所需的转换更糟糕(完美搭配)。

重载解析在 C++ 中是一件复杂的事情,因此人们不可能记住其中所有微妙的规则。但获得粗略的计划是很有可能的。我希望它对你有帮助。

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

运算符 >= 重载的奇怪行为 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz

随机推荐