递归应用operator->

use*_*138 7 c++

据说箭头运算符是递归应用的.但是,当我尝试执行以下代码时,它会在打印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在代码中找到语法,它就基本上应用以下算法:

  1. a?指针类型的?如果是这样,解决成员b*a?和呼叫(*a?).b.
  2. 否则,尝试解决 a?::operator ->
    1. 成功之后,设定a??? = a?::operator ->().转到1.
    2. 失败时,发出编译错误.

我很难想出一个简短而有意义的例子,其中一连串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)