簡體   English   中英

語法使用重載 - >運算符的返回值

[英]Syntax using the return value from an overloaded -> operator

所以我想我可能會過度思考這一點,但我想知道是否有人可以澄清為什么以下語句在給定代碼中有效

f->hello();

這是代碼

struct bar
{
    void hello()
    {
        std::cout << "Hello World";
    }
};

struct foo
{
    bar* f;
    foo() {
        f = new bar();
    }

    ~foo() {
        delete f;
    }

    bar* operator->() {
        return f;
    }
};

int main()
{
    foo f;
    f->hello(); //Works
}

由於以上代碼返回指針

bar* operator->() {
        return f;
    }

should'nt

f->hello(); actually be f->->hello();

為什么f-> hello()工作和f - > - > hello()失敗? 我認為f - > - > hello()應該起作用的原因是因為

f->ptrReturned->hello();

如果我們重載 - >運算符,我們需要返回一個ptr類型嗎? 形成我嘗試過的似乎不允許返回對象類型

顯然,這就是重載operator->如何工作。 -> (不包括運算符本身)之前的部分將被重載運算符的返回值替換。 例如, std::unique_ptr::operator->返回一個指針,然后由->取消引用。

你的理解基本上是正確的,但是->->是無效的語法。 您可以使用重載operator->喜歡

f.operator->()->hello();
//^^^^^^^^^^^^          return the pointer
//            ^^^^^^^^^ call hello() on the returned pointer

f->hello()被視為與f.operator->()->hello()相同f.operator->()->hello() ; 這使得使用帶有重載operator-> (例如智能指針 )的類與內置指針一致。 用法更自然,並且可以在更一般的上下文(如模板)中與原始指針一起使用。

和,

如果我們重載 - >運算符,我們需要返回一個ptr類型嗎?

有一些限制

運算符 - >的重載必須返回一個原始指針,或返回一個對象(通過引用或按值),而運算符 - >又被重載。

暫無
暫無

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

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