代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

为什么操作员->可以手动过载?

  •  15
  • fredoverflow  · 技术社区  · 15 年前

    如果 p->m 只是为了 (*p).m ?基本上,每 operator-> 我曾经写过的可以实现如下:

    Foo::Foo* operator->()
    {
        return &**this;
    }
    

    有我想要的箱子吗 p & gt;m 指的不是 (*p)m ?

    5 回复  |  直到 15 年前
        1
  •  18
  •   j_random_hacker    15 年前

    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!
    

    我记得有一次,这种行为对于使一个对象在类似智能指针的上下文中充当另一个对象的代理是必要的,尽管我不记得细节。我所记得的是,我只能让我的行为按照我的预期使用 a->b 语法,使用这种奇怪的特殊情况;我找不到一种方法 (*a).b 相似地工作。

    不确定这是否回答了你的问题;我真的是在说,“好问题,但比这更奇怪!”

        2
  •  3
  •   Mark Rushakoff    15 年前

    一个用例可能是当您在C++内部创建DSL时,沿着 Boost Karma (尽管看起来没有超载 -> 在他们的库中,你完全改变了传统C++运算符的含义。这是否是一个好主意当然有待讨论。

        3
  •  1
  •   Puppy    15 年前

    常规指针提供 p->m (*p).m p & gt;m 更为普遍。如果只允许重载其中一个,那么它将与默认类型不一致。至于为什么不让编译器重写它,简单的答案是,有时您不希望operator->返回t*,operator*返回t&。允许它们单独过载允许您不必考虑的组合。但是不允许它是愚蠢的,仅仅是因为我们目前没有任何理由去改变它。很像,如果需要的话,您可以使用int128类和重载操作符+=来表示求幂。

        4
  •  0
  •   PeterK    15 年前

    您可能需要执行一些其他操作,例如增加变量(访问计数)或甚至进行一些安全检查等。另一方面,我不需要重载运算符->…

        5
  •  -1
  •   Christopher Bertels    15 年前

    我认为它用于在Boost中共享指针(例如)。这使得它们看起来像普通的指针,尽管它们是特殊的指针(参考计数afaik)。

    推荐文章