2014-01-28 23 views
3

我似乎無法包裹我的頭。 std::shared_ptr->運算符僅返回指向成員的指針(可以說它是一個類的實例),但同時它可以用於調用方法......如何?我們沒有對->運算符返回的指針做任何事情,我們如何調用方法並訪問實例變量?如果我有一些功能等同的如我不明白的 - >運算符爲std :: shared_ptr

T* Get() { 
    return &t; 
} 

std::shared_ptr(是的,我做次感受是有get()方法),爲什麼我不能寫:

someSharedPtr.Get()SomeMethod() 

也就是說essentailly什麼:

someSharedPtr->SomeMethod() 

在做....我很困惑。如何返回指針替代->->operator->()->語法?

回答

13

如何返回指針替代類似->->operator->()->語法的東西?

因爲標準是這樣說的。

13.5.6 [over.ref]定義一個重載operator->做正確的事:

表達式x->m被解釋爲(x.operator->())->m一類對象T如果T::operator->()存在類型的x並且如果操作被重載解析機制(13.3)選爲最佳匹配函數。

如果沒有做到這一點,那麼你就無法實現這看上去是指針,並有通常的語義x->m用戶從一個類指針類型的期望類型。所以語言表示這就是它所做的,做任何其他事情都會使operator->超負荷。

這實際上允許你將調用連接到operator->爲任意深度,如果你有一個類似指針的類型返回一個指針類型,返回一個指針類型等,直到最後返回一個真正的指針。

+0

[Demo](http://coliru.stacked-crooked.com/a/42f8df8246ddcd82)鏈接'operator->'以防萬一誰有興趣。 – bames53

+0

@ bames53 [Bah](http://ideone.com/pHLXL2),爲什麼要停在'-1'? – Yakk

相關問題