0

我尝试为一个类重载括号运算符,以减少访问数组的繁琐。我不明白的是,为什么必须将重载函数的返回类型声明为引用?为什么一开始就不是左值?

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 返回的指针是可以取消引用和分配的有效左值,而不是重载返回的对象?我知道如果我直接分配给它会怎么样,因为我没有重载=,但是我分配给它的一个成员变量,这似乎应该是有效的?我只是很难理解,所以我感谢任何花时间提供帮助的人!

4

1 回答 1

1

你的代码

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
}
于 2013-04-26T03:34:16.723 回答