gpt4 book ai didi

c++ - 逻辑运算符执行顺序

转载 作者:太空狗 更新时间:2023-10-29 19:47:44 24 4
gpt4 key购买 nike

我已经了解了运算符重载并提供了一个有趣的代码:

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com