2014-01-28 2 views
3

나는 내 머리를 감쌀 수 없다. std::shared_ptr에 대한 -> 연산자는 멤버에 대한 포인터 (클래스의 인스턴스라고 가정합니다) 만 반환하지만 동시에 메서드를 호출하는 데 사용할 수 있습니다 ... 어떻게? 우리는 -> 연산자에 의해 반환 된 포인터에 대해 아무 것도하지 않습니다. 메서드를 호출하고 인스턴스 변수에 액세스하는 방법은 무엇입니까? 나는 (그래 나는 get() 방법이 relise 않음) std::shared_ptr에서나는 이해하지 못한다. -> 연산자 for std :: shared_ptr

T* Get() { 
    return &t; 
} 

등의 기능이 동일한 일을하는 경우, 왜 쓸 수 없습니다 : essentailly 무엇을

someSharedPtr.Get()SomeMethod() 

즉 :

someSharedPtr->SomeMethod() 

하고 있습니다 .... 혼란 스럽습니다. 포인터를 반환하면 ->-> 또는 operator->()-> 구문 대신 사용할 수 있습니까?

답변

13

->-> 또는 operator->()-> 구문 대신 포인터를 반환 할 수 있습니까?

표준에 따르면 그렇게합니다.

13.5.6은 [over.ref]은 옳은 일 수행 할 operator-> 과부하 정의 :

x->m는 클래스 객체 유형 T::operator->()가있는 경우 Tx에 대한 (x.operator->())->m로 해석을하고 작업자의 경우 과부하 해결 메커니즘 (13.3)에 의해 최상의 일치 기능으로 선택됩니다. 그것은 그렇게하지 않은 경우

, 당신은 포인터처럼 행동하고 사용자가 포인터와 같은 유형에서 기대 x->m의 일반적인 의미를 가지고 유형을 구현 할 수 없었다. 그래서 언어는 그것이하는 일이라고 말하면서 다른 것을하면 operator->의 오버로드가 덜 유용 할 것이라고합니다.

실제적으로 operator->에 대한 호출을 임의의 깊이로 연결할 수 있습니다. 포인터와 비슷한 형식을 반환하는 포인터와 비슷한 형식이면 마지막으로 무언가가 실제 포인터를 반환 할 때까지 포인터와 같은 형식을 반환합니다.

+0

관심있는 사람을 위해'operator->'를 연결하는 [Demo] (http://coliru.stacked-crooked.com/a/42f8df8246ddcd82). – bames53

+0

@ bames53 [Bah] (http://ideone.com/pHLXL2), 왜 '-1'에서 멈출까요? – Yakk

관련 문제