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

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

最佳答案

你的代码

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/

相关文章:

c++ - 从另一个进程重新启动一个进程

c++ - 在 c++ 中使用 operator 关键字在这里意味着什么?

python - += python 中 __setitem__ 的运算符(添加到方括号中)

objective-c - 如何更改特定索引处的 NSMutableArray 的值

Octave 将 strsplit 返回值向量化为单独的变量

C++ 重复 do-if-do 模式

c++ - 在 C++ 中,用自身初始化全局变量是否具有未定义的行为?

c++ - 什么决定从 std::endl 输出哪些字节

c++ - 重载运算符的显式特化 '<<'(左移)

c++ - 为什么函数名称被归类为 L 值表达式?