C++;如何从重载运算符中调用运算符的标准形式 我编写了一些测试字符串和字符相等的C++代码,为了简单起见,我想考虑n-虚线( 0x96 < /COD>)和M DASH( 0x97 < /代码>)字符是相同的。

C++;如何从重载运算符中调用运算符的标准形式 我编写了一些测试字符串和字符相等的C++代码,为了简单起见,我想考虑n-虚线( 0x96 < /COD>)和M DASH( 0x97 < /代码>)字符是相同的。,c++,operators,C++,Operators,我的第一反应是重新定义相等运算符,并开始编码,但随后遇到了一个问题: inline bool operator==(char lhs, char rhs) { if (lhs == 0x96 && rhs == 0x97) return true; // works fine else if (lhs == 0x97 && rhs == 0x96) return true; // works fine else return lhs == rhs;

我的第一反应是重新定义相等运算符,并开始编码,但随后遇到了一个问题:

inline bool operator==(char lhs, char rhs) {
  if (lhs == 0x96 && rhs == 0x97) return true; // works fine
  else if (lhs == 0x97 && rhs == 0x96) return true;  // works fine
  else return lhs == rhs; // infinite recursion...
}
在该函数的最后一行,理想情况下,我希望能够调用等式运算符的“旧”形式,类似于派生类能够调用函数的基类版本


我想知道这是否是C++中的可能?如果没有,我假设我应该将上述代码提取到一个单独的函数中,并调用该函数,而不是使用运算符。

您不能。重载运算符后,将替换默认运算符。(有一个有趣的例外:即
std::addressof
可用于绕过重载的
&
运算符)

对于重载
操作符==(char,char)
,我有强烈的保留意见:你会破坏很多代码


如果您真的必须这样做,您可以编写
(int)lhs==rhs
这将导致两个运算符都转换为
int
,从而阻止递归。由于
int
char
的超集,因此将始终对其进行定义。奇怪的是,这就是为什么之前的两个比较是有效的:一个
字符的隐式转换正在发生,这会阻止函数调用自身。

首先,不要试图在纯内置类型上重载运算符。。。使用函数代替

您的第一个比较语句之所以有效,是因为


char
将转换为
int
并进行比较。。。最后一个函数再次调用运算符

是有意义的,因此建议定义一个单独的函数,并且只在我需要它的特定位置使用它?当然。编写自己的函数名为“代码> FunyQuales(char,char)。我不认为在标准C++中允许内置的重载操作符。我从来没有尝试过,但是,再一次,我是一个缩小版的完美。也许他们有
#define char
,你可以猜到其余的!(在投资银行工作后,我看到了更糟的情况)。