2012-01-27 12 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