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 によって返されるポインターが逆参照および代入できる有効な左辺値であるのに、オーバーロードによって返されるオブジェクトではないのはなぜですか? をオーバーロードしていないので、直接割り当てていたらどうなるかわかりましたが、=メンバー変数の1つに割り当てていますが、これは有効なはずですか? 理解に苦しむだけなので、時間を割いて助けてくれる人に感謝します!

4

1 に答える 1