C++ 如何从重载运算符中调用运算符的标准形式
C++ How to call the standard form of an operator from within an overloaded operator
我正在编写一些需要测试字符串和字符相等性的 C++ 代码,为了简单起见,我想考虑 n-dash (0x96
) 和 m-dash (0x97
) 个字符相同。
我的第一直觉是重新定义相等运算符,并开始写代码,但后来运行陷入了一个问题:
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...
}
在该函数的最后一行,理想情况下我希望能够调用相等运算符的 'old' 形式,类似于派生 class 能够调用基数的方式class' 一个函数的版本。
我想知道这在 C++ 中是否可行?如果没有,我假设我应该将上面的代码提取到一个单独的函数中并调用该函数而不是使用运算符。
你不能。一旦你重载了一个运算符,你就替换默认的。 (有一个有趣的例外:即 std::addressof
可用于规避重载的 &
运算符)。
我对重载持强烈保留意见operator==(char, char)
:你会破坏很多代码。
如果你 真的 必须这样做,你总是可以写 (int)lhs == rhs;
这将导致 both 运算符转换为int
所以阻止了递归。由于 int
是 char
的超集,这将始终被定义。奇怪的是,这就是您之前的两个比较起作用的原因:正在进行 char
的隐式转换,这会阻止函数调用自身。
首先,永远不要试图重载纯粹基于内置类型的运算符...改用函数...
,您的第一个比较语句起作用了
char
将转换为 int
并进行比较...最后一个再次致电您的接线员
我正在编写一些需要测试字符串和字符相等性的 C++ 代码,为了简单起见,我想考虑 n-dash (0x96
) 和 m-dash (0x97
) 个字符相同。
我的第一直觉是重新定义相等运算符,并开始写代码,但后来运行陷入了一个问题:
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...
}
在该函数的最后一行,理想情况下我希望能够调用相等运算符的 'old' 形式,类似于派生 class 能够调用基数的方式class' 一个函数的版本。
我想知道这在 C++ 中是否可行?如果没有,我假设我应该将上面的代码提取到一个单独的函数中并调用该函数而不是使用运算符。
你不能。一旦你重载了一个运算符,你就替换默认的。 (有一个有趣的例外:即 std::addressof
可用于规避重载的 &
运算符)。
我对重载持强烈保留意见operator==(char, char)
:你会破坏很多代码。
如果你 真的 必须这样做,你总是可以写 (int)lhs == rhs;
这将导致 both 运算符转换为int
所以阻止了递归。由于 int
是 char
的超集,这将始终被定义。奇怪的是,这就是您之前的两个比较起作用的原因:正在进行 char
的隐式转换,这会阻止函数调用自身。
首先,永远不要试图重载纯粹基于内置类型的运算符...改用函数...
,您的第一个比较语句起作用了char
将转换为 int
并进行比较...最后一个再次致电您的接线员