重载运算符 "->"

5

我在研究重载 -> 操作符。 我想出了以下简单示例:

struct foo
{
    int p = 12;
};

struct A
{    
    foo* f;
    A()
    {
        this->f = new foo();
    }
    foo* operator-> ()
    {
        return f;
    }
};

int main()
{
    A a;
    std::cout << a->p; //output 12
}

虽然这个例子可以运行,但我希望有人能告诉我它为什么能够运行。 我曾认为它应该像这样工作

std::cout << a->->p; //The first arrow returns the pointer 
                     //the second arrow dereferences it

但在这里似乎单个箭头不仅返回指针,而且还对其进行解引用。这是C ++中的特殊情况吗?

1个回答

5
是的,这是按设计要求的。operator-> 会在返回值上递归调用,因此我们可以像使用裸指针一样使用这种类(称为智能指针)。
如果提供了用户定义的 operator->,则会在其返回值上递归调用 operator->,直到到达返回裸指针的 operator->。之后,将应用内置语义到该指针上。

1
我不确定这解释了为什么operator->不能返回引用。智能指针只会返回引用而不是指针。(实际上,对我来说不清楚为什么operator->不能隐式地通过一元运算符operator*来实现。) - cdhowie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接