5
struct A 
{ 
    void f() {} 
}; 

void f() {} 

int main() 
{ 
    auto p1 = &f;  // ok 
    auto p2 = f;  // ok 
    auto p3 = &A::f; // ok 

    // 
    // error : call to non-static member function 
    // without an object argument 
    // 
    auto p4 = A::f; // Why not ok? 
} 

なぜメンバー関数へのポインタを取得するためにアドレス演算子を使用する必要がありますか?メンバー関数へのポインタを取得するためにアドレス演算子を使用する必要があるのはなぜですか?

+0

ここで何をしようとしていますか?なぜあなたはメンバ関数のアドレスが必要でしょうか?あなたがそのようなことをしていたらどうしますか?例えば、 – tadman

+0

。 'std :: bind(&A :: f、A()); ' – xmllmx

+1

メンバ関数を' std :: thread'に渡すときにも。 –

答えて

3
auto p1 = &f;  // ok 
auto p2 = f;  // ok 

第1のものは多かれ少なかれ正しいものです。しかし、非メンバ関数はポインタに対してimplicit conversionsを持っているので、&は必要ありません。 C++はその変換をスタティックメンバ関数にも同じappliesにします。 cppreferenceから引用し

関数型Tの左辺値はすることができ、暗黙的にその機能にprvalue ポインタにを変換します。これは、非静的メンバー関数 には適用されません。これは、非静的メンバー関数を参照する左辺値が でないためです。

関連する問題