如果 - >运算符不会像点一样返回引用。运营商?这会停止超载 - >运算符也是?

时间:2015-09-12 10:56:49

标签: c++ operators overloading dot-operator

历史:为什么我们可以超载 - >并不是 。运营商?两者都是成员访问运营商,具有相同的意义。

我已经阅读了

的一些参考资料

http://www.stroustrup.com/bs_faq2.html#overload-dot

Why can operator-> be overloaded manually?

但我仍然怀疑为什么我们可以超载.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!  

z-> foo = 42;此调用转换为((z.operator())。opeartor())。operator(),因此foo的值设置为42。

问题: - 如果我采取这一点,我还有两点,

1)为什么不能。(点)运算符这样工作?

2)如果 - >运算符不返回类Y的引用?那种情况下会出现编译错误吗?

1 个答案:

答案 0 :(得分:4)

我只知道操作员如何重载 - >阅读后this

  

表达式E1-> E2与内置类型的(* E1).E2完全相同。如果是用户定义的运算符 - >提供,运营商 - >再次调用它返回的值,直到操作符 - >到达,返回一个普通指针。之后,内置语义应用于该指针。

要回答你的第二个问题......让我们再看看你的例子:

struct X { int foo; };

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

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

Z z;
z->foo = 42;          // Works!

致电z->评估为z.y。这不是指针,因此递归继续:(z.y)->评估为&(z.y.x)。这是一个指针,结果表达式为(&(z.y.x))->

如果让Zs运算符返回指针,则递归停在&(z.y)Y没有foo,编译器会抱怨。