为什么operator->手动重载?

fre*_*low 15 c++ pointers smart-pointers operator-overloading

如果p->m仅仅是语法糖是不是有意义(*p).m?基本上,operator->我写过的每一个都可以实现如下:

Foo::Foo* operator->()
{
    return &**this;
}
Run Code Online (Sandbox Code Playgroud)

在任何情况下,我想要p->m的意思是什么(*p).m

j_r*_*ker 18

operator->()在返回类型允许的情况下,隐式地重复调用具有奇怪的区别.最明显的方法是使用代码:

struct X {
    int foo;
};

struct Y {
    X x;
    X* operator->() { return &x; }
};

struct Z {
    Y y;
    Y& operator->() { return y; }
};

Z z;
z->foo = 42;          // Works!  Calls both!
Run Code Online (Sandbox Code Playgroud)

我记得有一种情况,这种行为是必要的,以使一个对象在类似智能指针的上下文中作为另一个对象的代理,尽管我不记得细节.我记得的是a->b,通过使用这个奇怪的特殊情况,我只能通过使用语法来使行为正常工作; 我找不到(*a).b类似工作的方法.

不确定这会回答你的问题; 我真的在说,"好问题,但它甚至比那更奇怪!"

  • PS:我会把它称为*句法糖蜜* - 减慢我对爬行的理解......:P (3认同)
  • 你的意思是,如果语言规范要求编译器将`a-> b`重写为`(*a).b`,那么递归调用`operator*()`是否仍然有意义?不,因为有时需要在"结束"之前停止(即返回指针/类指针对象,例如,因此您可以修改它,而不是返回最终的指向对象).该`运营商 - >()`递归的怪事是可能的(有必要吗?),因为它不是一个真正的"正确"的2 ARG运营商 - 第二届"参数"必须是一个'struct`字段名,这是一件好事,可以"用C++类型系统表示. (2认同)