运算符重载和隐含转换为bool与安全bool习语有关

时间:2012-01-27 05:43:44

标签: c++ operator-overloading implicit-conversion

我确信以前可能会问过我的一些问题,所以请告诉我:)。

首先,一个例子:

#include <iostream>
struct A
{
    typedef void (A::*funcptr)();
    operator funcptr() {
        std::cout << "funcptr" << std::endl;
    }
};

int main()
{
    A a;
    if (a) {}
}

if(a)operator funcptr()被调用,但我不确定这里发生了什么。我假设编译器正在寻找从Abool的转换并找到operator functptr这是可以的,但转换如何使用指向成员函数的指针?

另外,如果我将operator funcptr()更改为operator int A::*()它也可以,但operator void A::*没有(我得到cannot declare pointer to 'void' member),我缺少的规则是什么那里? (我的问题主要与试图完全理解安全的bool成语有关)

另外,如果我声明operator bool()它会优先,那么优先级有哪些规则?

1 个答案:

答案 0 :(得分:2)

要回答第二个问题,请使用

operator int A::*() { }

然后你要创建一个转换运算符,它返回一个指向int成员的指针。不是指向成员函数的指针。由于您不能拥有void类型的成员,

operator void A::*() { }

无效。