在C ++中重载运算符时,为什么T *优于bool?

Rad*_*u C 6 c++ class operator-overloading conversion-operator implicit-conversion

我有一个包装器类,其行为应类似于指针。我已经过载operator T*operator bool。布尔进行了一些额外的验证。我尝试在if中使用该对象,但我注意到该operator T*对象称为和bool。有人可以解释我为什么吗?是在标准中以某种方式指定的吗?我在MSVC,clang和gcc中测试了以下示例代码,它们都调用operator T*。另外,根据我在此页面上阅读的内容(https://en.cppreference.com/w/cpp/language/implicit_conversion),if应该尝试转换为bool

#include <stdio.h>

class MyClass
{
public:
    MyClass(int i)
        : m(i)
    {}

    operator bool() const
    {
        printf("operator bool()\n");
        return m;
    }

    operator int* ()
    {
        printf("operator int* ()\n");
        return &m;
    }

private:
    int m;
};

int main()
{
    MyClass a(5);
    MyClass b(0);

    if (a)
        printf("a is true\n");
    else
        printf("a is false\n");

    if (b)
        printf("b is true\n");
    else
        printf("b is false\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

PS:我也尝试过!!(bool),但它仍然调用operator int*()。对于operator bool(),我必须明确地调用它。

Vla*_*cow 7

在您的类定义中,operator bool使用限定符声明转换运算符,const但if语句中使用的对象不是常量对象。

operator bool() const
                ^^^^^
{
    printf("operator bool()\n");
    return m;
}
Run Code Online (Sandbox Code Playgroud)

删除限定符constoperator bool将呼叫操作员。

或者operator int *像这样声明转换运算符

operator const int* () const
{
    printf("operator int* ()\n");
    return &m;
}
Run Code Online (Sandbox Code Playgroud)

然后将再次operator bool呼叫操作员。

当运算符具有限定符const并应用于非常数对象时,则需要再进行一次转换,即限定条件转换。

此外,您甚至可以声明运算符为显式的。例如

explicit operator bool() 
{
    printf("operator bool()\n");
    return m;
}
Run Code Online (Sandbox Code Playgroud)

  • 详细说明:非const成员函数胜过重载解析,因为它比const成员函数需要更少的转换。 (2认同)