2012-01-27 68 views
3

我确信我的一些问题可能之前已经被问过,所以请让我知道:)。运算符重载并隐式转换为与安全布尔成语相关的布尔

首先,例如:

#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),什么是我缺少的有规则? (我的问题主要涉及到试图充分理解安全布尔成语)

此外,如果我宣布operator bool()它将优先,那么有什么优先规则?

+3

这是你的工作,从'operator funcptr'返回'funcptr'的方式是 – 2012-01-27 05:48:11

+0

@SethCarnegie:对,这只是一个例子来说明我的问题。 – 2012-01-27 05:51:16

回答

2

要回答你的第二个问题,如果你使用

operator int A::*() { } 

,那么你正在创建一个转换操作符,它返回一个指向一个int成员。不是指向成员函数的指针。由于您不能拥有void类型的成员,因此无法使用

operator void A::*() { } 

无效。

+0

谢谢,我现在看到了差异,'int A :: *()'返回一个指向int成员的指针,而'operator functptr()'返回一个指向成员函数的指针。 – 2012-01-27 05:57:56

+0

我知道你应该使用typedef指向成员函数,但是如果没有typedef,它会是什么样子? – 2012-01-27 06:05:23

+0

我相信它会是(A :: * operator void())(){...}但实际上可能并不合法。 – 2012-01-27 06:31:13