据说箭头运算符是递归应用的。但是当我尝试执行以下代码时,它在应该打印 4 的情况下却打印出乱码。
class dummy
{
public:
int *p;
int operator->()
{
return 4;
}
};
class screen
{
public:
dummy *p;
screen(dummy *pp): p(pp){}
dummy* operator->()
{
return p;
}
};
int main()
{
dummy *d = new dummy;
screen s(d);
cout<<s->p;
delete d;
}
Stanley 所说的“递归”只是将运算符应用于每个返回的对象until返回的类型是指针。
第一次尝试时会发生这种情况:screen::operator ->
返回一个指针。因此,这是对operator ->
编译器尝试的。然后它解析运算符的右侧 (p
)通过在返回的指针类型中查找成员(dummy
)用这个名字。
本质上,每当编译器发现语法aᵢ->b
在代码中,它本质上应用了以下算法:
- Is
aᵢ
指针类型?如果是这样,请解决成员b
of *aᵢ
并打电话(*aᵢ).b
.
- Else, try to resolve
aᵢ::operator ->
- 成功后,设置
aᵢ₊₁ = aᵢ::operator ->()
。转到1。
- 失败时,发出编译错误。
我很难想出一个简短而有意义的例子来说明chain of operator ->
调用甚至是有意义的。也许唯一真正的用途是当您编写智能指针类时。
但是,下面的玩具示例至少可以编译并生成一个数字。但我不建议实际编写这样的代码。它会破坏封装并使小猫哭泣。
#include <iostream>
struct size {
int width;
int height;
size() : width(640), height(480) { }
};
struct metrics {
size s;
size const* operator ->() const {
return &s;
}
};
struct screen {
metrics m;
metrics operator ->() const {
return m;
}
};
int main() {
screen s;
std::cout << s->width << "\n";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)