我已经了解了运算符重载并提供了一个有趣的代码:
#include <iostream>
class A {
public:
operator bool() {
return true;
}
bool operator!() {
return false;
}
};
int main() {
A a;
if (!a) {
std::cout << "HELLO";
} else {
std::cout << "WORLD";
}
std::cout << std::endl;
return 0;
}
首先调用什么,之后调用什么?为什么?这在 cppreference 的任何地方都有描述吗?
附言对于反对者和其他认为我无法自己执行此代码的人。我可以。我做到了。我已经多次更改它以查看它的行为。所以呢?这不是解释。我已要求提供一份引用资料,该引用资料清楚地说明了此代码遵守的规则。它在我的机器上如何工作的信息没有回答这个问题 - 如果它甚至不能跨不同环境(操作系统,可能是处理器等)移植怎么办?
最佳答案
它的工作原理很简单。编译器解析源代码并查看 if(!a)
。然后检查 A
是否定义了 operator!
。恰好它确实如此。这样就被调用了。
如果它看到了 if(a)
,它会检查 A
是否可以转换为可以在 if< 的条件下使用的东西
。恰好它确实是可转换的。
如果没有 operator!
,编译器会改为检查 A
是否可以转换为逻辑上可能取反的内容。 然后将执行到 bool 的转换。
顺便说一句,转换甚至会在令人惊讶的地方发生。例如 a + 1
将编译。我认为这不是我们想要的。最好只在上下文需要 bool
的地方允许它。您可以通过显式标记转换运算符来做到这一点:
explicit operator bool() {
return true;
}
关于c++ - 逻辑运算符执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429039/