gpt4 book ai didi

c++ - 运算符的递归应用->

转载 作者:可可西里 更新时间:2023-11-01 18:20:49 25 4
gpt4 key购买 nike

据说箭头运算符是递归应用的。但是当我尝试执行以下代码时,它应该打印 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 所说的“递归”只是运算符应用于每个返回的对象直到返回的类型是一个指针。

第一次尝试时会发生这种情况:screen::operator -> 返回一个指针。因此,这是编译器尝试对 operator -> 的最后一次调用。然后,它通过在返回的指针对象类型 (dummy) 中查找具有该名称的成员来解析运算符 (p) 的右侧 sice。

基本上,每当编译器在代码中发现语法 aᵢ->b 时,它基本上应用以下算法:

  1. aᵢ是指针类型吗?如果是,则解析 *aᵢ 的成员 b 并调用 (*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";
}

关于c++ - 运算符的递归应用->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com