2012-11-06 2 views
3
나는 다음은 컴파일러에 의해 허용 될 것이다 인식 C++ 11 - 표준에서 std::bind 놀고 있었는데

:멤버 함수에 '&'가 필요한 이유는 무엇입니까 (예 : std :: bind)?

class Foo 
{ 
public: 
    void F(); 
    int G(int, int); 
}; 

void Foo::F() 
{ 
    auto f = bind(&Foo::G, this, _1, _2); 
    cout << f(1,2) << endl; 
} 

int Foo::G(int a, int b) 
{ 
    cout << a << ',' << b << endl; 
    return 666; 
} 

을하지만 난에 Foo::G 앞에있는 '&'를 제거하는 경우 bind- 라인, 나는 약간의 컴파일러 에러 (MinGW 4.7 사용)를 얻을 것이다.

H&H이 모두 "일반적인"기능을 수행하지만 Foo::G이 멤버 함수에 대한 포인터로 유효하지 않은 이유는 무엇입니까?

LG ntor

+4

특별한 이유없이 - Bjarne는 회원 함수의 주소를 취하기 위해'&'를 요구하기로 결정했습니다. –

+8

... 그렇지 않으면 멤버 함수의 이름이 함수 포인터로 쇠퇴 할 때 멤버 함수 포인터로 쇠퇴하지 않습니다. –

+4

그리고 C++에서 C와 하위 호환이 필요하지 않은 경우 함수가 포인터로 부패하지 않을 것이라고 보증합니다. –

답변

2

가 나는 이유 중 하나는 일관성되었을 수 있음을 가져 가라. 대신 멤버에 대한 포인터를 형성하는, 정규화 된 이름 이름 때문에 멤버 함수를 잘 컴파일

MyClassOrOneOfItsBases::memberFunction(); 

클래스 내에서, 당신이 말할 수 있음을 기억하자.

+1

멤버 데이터로 더욱 생생해진다 : void MyClass :: foo() {bar (MyClass :: baz); }'. – Xeo

+0

멤버 함수 포인터 만 사용하는 것이었지만 어쨌든 thx를 사용했습니다. –

+0

@xeo 매우 좋습니다. 감사합니다. –

관련 문제