簡體   English   中英

關於 C++ 中運算符重載的困惑

[英]confusion about operator overload in C++

我定義了一個類來包裝原始指針,因此可以自動刪除指針。 這是我的代碼

#include <iostream>
class Entity
{
private:
    std::string e_name;
public:
    Entity():e_name("unknown"){}
    void whoami() {
        std::cout << e_name;
    }
};
class ScopePointer
{
private:
    Entity *_e;
public:
    ScopePointer(Entity *e) : _e(e) {}
    ~ScopePointer() { delete _e; }
    Entity *operator->() { return _e; }
};

int main(int argc, char *argv[])
{
    ScopePointer p(new Entity());
    p->whoami();
}

它運作良好,但我很不明白p->whoami(); 作品。 我的意思是操作符 -> ScopePointer 中的重載應該像下面一樣工作

p.operator->()->whoami();or p->->whoami();

第一個->應該返回 Entity* 和下一個->調用類方法。 為什么只有一個 -> 可以讓它工作?

我希望 C++ 14 標准中的這句話有助於理解運算符的工作原理。

C++ 14 標准(13.5.6 類成員訪問,p #1)

如果 T::operator->() 存在並且運算符被選為最佳匹配函數,則表達式 x->m 被解釋為 (x.operator->())->m 用於類型為 T 的類對象 x通過重載解析機制。

因此,重載運算符實際上是內置運算符-> 的“前綴表達式”,它提供了內置運算符中使用的指針。

我很不明白p->whoami(); 作品

->運算符的普通規則有一個例外,因此您只需要一個-> 該語言要求實現遞歸地計算operator->直到它找到一個指針對象,而不是某個類類型的對象。

來自[over.ref]

類成員訪問運算符函數是一個名為operator->的函數,它是一個不帶參數的非靜態成員函數。 對於形式的表達

后綴表達式-> 模板選擇id 表達式

運算符函數由重載決議([over.match.oper])選擇,表達式被解釋為

( postfix-expression . operator->() ) -> 模板opt id-expression

暫無
暫無

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

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