gpt4 book ai didi

c++ - 为什么需要从重载括号运算符返回引用(OR : why is an lvalue not returned otherwise)?

转载 作者:行者123 更新时间:2023-11-28 07:38:54 25 4
gpt4 key购买 nike

我试过为一个类重载括号运算符,以使访问数组变得不那么乏味。我不明白的是,为什么必须将重载函数的返回类型声明为引用?为什么它一开始就不是左值?

struct particle
{
double v_x;
}

struct particleSwarm
{
int numParticles;
particle* particles;
particle operator[](int i) { return particles[i]; }
}

它返回一个 particle 结构,那么为什么这是无效的,除非我让运算符返回一个引用:

void foo(particleSwarm& swarm)
{
swarm[0].v_x = 5.0;
}

我不明白的是,为什么重载函数还没有返回左值?当试图弄清楚时,我发现这样的事情是有效的:

int* foo(particleSwarm* swarm)
{
return &(swarm->numParticles);
}

void bar(particleSwarm* swarm)
{
*(foo(swarm)) = 5;
}

为什么 foo 返回的指针是一个可以取消引用和赋值的有效左值,而不是重载返回的对象?我知道如果我直接给它赋值会怎样,因为我没有重载 =,但我正在赋给它的一个成员变量,它看起来应该是有效的?我只是很难理解,所以我感谢任何愿意花时间提供帮助的人!

最佳答案

你的代码

void foo(particleSwarm& swarm)
{
swarm[0].v_x = 5.0;
}

会被编译成类似的东西

void foo(particleSwarm& swarm)
{
particle tmp = swarm.operator[](0);
tmp.v_x = 5.0;
// destruct tmp
}

关于c++ - 为什么需要从重载括号运算符返回引用(OR : why is an lvalue not returned otherwise)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227783/

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