2012-01-27 5 views
3

私の質問のいくつかは前に質問されている可能性がありますので、私に教えてください:)。オペレータのオーバーロードと安全なboolイディオムに関するboolへの暗黙的な変換

まず、例:if(a)

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

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

operator funcptr()が呼び出されますが、私はここで何が起こっているのか正確にはわかりません。私は、コンパイラがAからboolへの変換を探していると仮定していますが、operator functptrは大丈夫ですが、変換はどのようにメンバ関数へのポインタで動作しますか?

また、私はoperator int A::*()operator funcptr()を変更した場合、それはまた、動作しますが、(私はcannot declare pointer to 'void' memberを取得)operator void A::*ないだろう、私はそこに行方不明ですルールは何ですか? (私の質問は主に安全なブールのイディオムを完全に理解しようとすることに関連しています)

また、私がoperator bool()と宣言した場合、それが優先されるので、優先順位の規則は何ですか?

+3

途中で 'operator funcptr'から' funcptr'を返すのはあなたの仕事です。 –

+0

@SethCarnegie:これは私の質問を示す単なる例です。 –

答えて

2

あなたは

operator int A::*() { } 

を使用している場合、あなたはint型のメンバへのポインタを返す変換演算子を作成している、あなたの2番目の質問に答えるために。メンバー関数へのポインタではありません。 void型のメンバーを持つことができないので、

operator void A::*() { } 

は無効です。

+0

ありがとう、私は違いが今、 'int A :: *()'はintメンバへのポインタを返しますが、 'operator functptr()'はメンバ関数へのポインタを返します。 –

+0

メンバ関数へのポインタにtypedefを使うべきだと知っていますが、typedefなしではどのように見えますか? –

+0

私はそれが(A :: * operator void())(){...}と考えていますが、それは実際には合法的ではないかもしれません。 –

関連する問題