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

标签 c++

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

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

相关文章:

c++ - 删除字符串中具有相同值的任何相邻字母的 “pair”

c++ - for 循环 c++ 'toupper' 实现

c++ - 可以以某种方式省略 `get_mpz_t()` 吗?

c++ - 如何在 C++ 中连接两个结构类型变量?

c++ - Vim : Override equalprg with a command with argument

c++ - 在非 ONPaint 的 MFC 方法中显示图像

c++ - OpenCV calibrateCamera 不收敛到正确的解决方案(投影仪校准)

c++ - vector 的返回 vector

c++ - 如何在C++中按字节写入文件

c++ - 为什么 strcmp 返回 int 而不是 char?