当一个对象同时提供`operator!`和`operator bool`时,它在表达式`!obj`中使用?

pol*_*ket 9 c++ overloading operator-keyword

我遇到了一个我无法自己回答的问题.此外,我没有在谷歌和这里找到答案.比如,我想在if子句中"检查对象的有效性",如下所示:

MyClass myObject;

// [some code, if any]

if (!myObject)
{
    // [do something]
}
Run Code Online (Sandbox Code Playgroud)

我们MyClass这样定义:

class MyClass
{
public:
    MyClass() { };
    virtual ~MyClass() { };
    bool operator!()
    {
        return !myBool;
    };
    operator bool()
    {
        return myBool;
    };
private:
    bool myBool = 0;
};
Run Code Online (Sandbox Code Playgroud)

我现在的问题是:在这个if子句中实际使用了哪一个重载运算符?无论哪种方式,结果显然都是一样的.

Mik*_*our 8

它会用operator!.

将优先选择参数类型与参数匹配的函数,而不是需要类型转换的函数.