为什么需要从重载括号运算符返回引用(OR:为什么不返回左值)?

时间:2013-04-26 02:26:28

标签: c++ operator-overloading lvalue square-bracket

我已经尝试重载一个类的括号运算符,使得访问该数组不那么繁琐。我不明白的是,为什么将重载函数的返回类型声明为引用是必要的?为什么它不是开始的左值?

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返回的指针是一个有效的左值,它可以被解引用并分配给,但不是由重载返回的对象?我看到如果我直接分配给它是不会的,因为我没有重载=,但我分配给它的一个成员变量,它看起来应该是有效的?我只是很难理解,所以我感谢任何花时间提供帮助的人!

1 个答案:

答案 0 :(得分: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
}