历史:为什么我们可以超载 - >并不是 。运营商?两者都是成员访问运营商,具有相同的意义。
我已经阅读了
的一些参考资料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的引用?那种情况下会出现编译错误吗?
答案 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
,编译器会抱怨。