使用重载->运算符的返回值的语法

时间:2018-07-29 03:41:14

标签: c++ operator-overloading

所以我想我可能会对此考虑得过头,但是我想知道是否有人可以澄清为什么以下语句在给定的代码中起作用

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;
    }

不应该

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

为什么f-> hello()起作用而f->-> hello()失败? 我认为f->-> hello()应该起作用的原因是

f->ptrReturned->hello();

如果我们重载->运算符,是否需要返回ptr类型?形式我尝试过的似乎不允许返回对象类型

2 个答案:

答案 0 :(得分:1)

显然,这就是重载operator->的工作方式。 ->之前的部分(不包括运算符本身)被重载运算符的返回值替换。例如,std::unique_ptr::operator->返回一个指针,然后该指针被->取消引用。

答案 1 :(得分:1)

您的理解基本上是正确的,但是->->是无效的语法。您可以像这样使用重载的operator->

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

f->hello()f.operator->()->hello()相同;这使得带有重载operator->(例如smart pointers)的类的使用与内置指针一致。用法会更自然,并且可以在更通用的上下文(如模板)中与原始指针一起使用。

然后

  

如果我们重载->运算符,是否需要返回ptr类型?

有一些restrictions

  

运算符->的重载必须返回原始指针,或者返回对象(按引用或按值),而运算符->的对象又被重载。