据说箭头运算符是递归应用的.但是,当我尝试执行以下代码时,它会在打印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;
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*lph 11
Stanley所说的"递归"只是将运算符应用于每个返回的对象,直到返回的类型为指针.
这在第一次尝试时发生:screen::operator ->返回一个指针.因此,这是operator ->编译器尝试的最后一次调用.然后p通过在返回的指针类型(dummy)中查找具有该名称的成员来解析operator()的右手.
基本上,只要编译器a?->b在代码中找到语法,它就基本上应用以下算法:
a?指针类型的?如果是这样,解决成员b的*a?和呼叫(*a?).b.a?::operator ->
a??? = a?::operator ->().转到1.我很难想出一个简短而有意义的例子,其中一连串的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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |