簡體   English   中英

關於智能指針中的解引用和成員選擇運算符的定義

[英]Regarding definition of dereferencing and member selection operators in smart pointer

在智能指針實現中,始終將解除引用運算符和成員選擇運算符定義如下。

T& operator* () const     // dereferencing operator
{
    return *(m_pRawPointer); 
}

T* operator->() const     // member selection operator
{
    return m_pRowPointer;
}

我不太明白為什么前者是通過引用返回的,而后者是通過指針返回的。 只是為了區分它們還是其他原因? 更具體地說,我可以使解引用運算符通過指針返回,而另一個通過引用返回嗎?

為什么前者通過引用返回

因此,表達式*thing給出了一個表示T類型對象的左值 ,就像thing是指針一樣。

后者由指針返回

因為這就是指定語言的方式。 請注意,您永遠不會直接使用->的結果,而是始終使用thing->member形式的表達式。

如果thing是一個類類型,則通過調用operator->進行評估,然后將->member應用於結果。 為了支持這一點,它必須返回一個指針或另一個也會重載operator->類類型。

我可以通過指針使解引用運算符返回

是的,但這會造成混亂,因為它與應用同一運算符的指針的行為不同。 您必須說些**thing才能訪問T

而另一個通過引用返回

不,因為那會破壞語言關於重載運算符應如何工作的內置假設,從而使其無法使用。

取消引用運算符按引用返回而成員選擇運算符按指針返回的原因是將使用智能指針的語法與使用原始指針的語法進行對齊:

int* p = new int(42);
*p = 7;

std::unique_ptr<int> p(new int(42));
*p = 7;

您絕對可以讓您的取消引用運算符返回您想要的任何內容:

struct IntPtr {
    int* p;

    int* operator*() { return p; }
};

但是,這對於您的用戶在不得不編寫時會造成很大的困擾:

IntPtr p{new int{42}};
**p = 7;

箭頭運算符在[over.ref]中有所不同:

表達式x->m解釋為(x.operator->())->m

因此,您必須返回可以在其上調用->m ,否則您將收到類似(來自gcc)的錯誤:

錯誤:'operator->()'的結果產生非指針結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM