2016-12-25 8 views
-1
void foo(); 
class Foomatic() { 
    void bar(); 
    void baz() 
    { 
     std::thread a(foo); // this compiles 
     std::thread b(Foomatic::bar, this); // this doesn't 
     std::thread c(&Foomatic::bar, this); // and this compiles 
     // ... 
    } 
}; 

멤버 함수에 대한 포인터의 올바른 구문은 &Foomatic::bar입니다.멤버 함수에 대한 포인터 - 구문

하지만 정확히 Foomatic::bar은 왜 잘못 되었습니까? 그 사람이 무엇을 반환합니까? 그리고 정확히 &Foomatic::bar이 정확한 이유는 무엇입니까? 나에게 반 직관적 인 것처럼 보인다.

이것은 중복되지 않습니다. 연결된 문항에서 이유를 설명하지 않고 올바른 구문이 무엇인지 대답합니다.

저는 C++이 왜 여기에 일관성이 없는지 묻습니다. 이미 구문이 무엇인지 압니다. (당신은 주소의 운영자 &을 사용하여 함수의 주소을 가지고 있기 때문에)

+0

@Ed 치유 : 이것은 중복되지 않습니다. 나는 그것이 무엇인지 알기 때문에 올바른 구문이 무엇인지 묻고 싶습니다. 그러나 ** 올바른 구문의 정확한 이유는 무엇입니까 **. 대답은 올바른 구문이 무엇인지 말합니다. – marmistrz

+3

대답은 동어 반복입니다. 언어 사양에 그렇게 나와 있기 때문에 구문이 올바르지 않습니다. 90 분 동안 축구 경기가 열리는 이유는 무엇입니까? 그게 규칙이 말하는거야. –

+3

아마 진짜 질문은'a (& foo)'일 때''(foo)'가 작동하는 이유입니다. –

답변

4

C++에서 C에서 함수 포인터로 함수에서 변환을 상속했습니다. C에서 주소를 가져올 필요없이 함수 포인터에 함수 이름을 지정할 수 있습니다. 함수 이름에 대한 함수 이름의 "쇠퇴"가 약간 잘못 알려졌고 C에서 혼란을 일으켰습니다.

도입 된 곳의 포인터가 C와 하위 호환이 필요하지 않은 경우 : C에는 포인터가 없습니다 회원들에게. 따라서 멤버 이름에서 멤버에 대한 포인터로의 암시 적 변환을하지 않을 수있는 옵션이있었습니다. 시설은 필요하다고 느끼지만 제거가 거의 안되는 경우 나중에 추가 할 수 있으므로 멤버 이름에서 멤버에 대한 포인터로 암시 적 변환되지 않도록 선택되었습니다.

함수에 대한 포인터, 멤버에 대한 포인터 및 개체에 대한 포인터를 얻기위한 합리적으로 일관된 인터페이스가 있으므로 멤버 이름에서 멤버에 대한 포인터로의 암시 적 변환이 필요하지는 않습니다. 객체 이름에서 객체에 대한 포인터로 암시 적으로 변환하지 않습니다.

의미 상으로, T::member과 같은 것은 구성원에 대한 포인터가 아니라 구성원에 대한 참조입니다. 그러나, 나는 현재의 사양으로이 유형을 공식화하는 것이 가능하다고 생각하지 않는다. 향후 표준에서이 구문에 대한 someting을 정의 할 수 있습니다.

0

&Foomatic::Bar 경우 포인터 - 투 - 멤버 함수, 다음 Foomatic::Bar멤버 함수이다 아닌 포인터에 -member 함수.

이것은 비 멤버 함수와 완전히 동일합니다. &foo이 (비 멤버) 함수에 대한 포인터 인 경우 foo이 함수입니다.

C++이나 C 중 어느 것도 유형 1/값이 함수 인 변수를 가질 수 없습니다. 예를 들어 포인터 만 사용할 수 있습니다. 비 멤버 함수에 대한 문법 설탕 특별한 경우로

, 당신은 foo(42)이 (비회원)에 대한 포인터입니다 (*foo)(42)foo 경우에 대한 짧은 손으로, 예를 들어, 첫 번째 명시 적으로 복종하지 않고 기능을 말했다 호출 할 수 있습니다 기능.