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 

첫 번째 것은 다소 옳은 것입니다. 그러나 비회원 함수는 포인터에 implicit conversions이 있으므로 &은 필요하지 않습니다. C++에서는 정적 멤버 함수에 해당 변환을 수행합니다. applies

cppreference에서 인용하자면 : 기능 형 T

좌변이 수 있습니다 암시 적으로 그 함수에 prvalue 포인터 변환. 비 정적 멤버 함수를 참조하는 lvalues는 이 없기 때문에 비 정적 멤버 함수에는 적용되지 않습니다.