Почему требуется возвращать ссылку от операторов перегрузки скобок (ИЛИ: почему lvalue не возвращается иначе)?

Я попытался перегрузить операторы скобок для класса, чтобы сделать доступ к массиву менее утомительным. Чего я не понимаю, так это почему необходимо объявить возвращаемый тип функции перегрузки в качестве ссылки? Почему это не lvalue для начала?

struct particle
{
double v_x;
}

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

Возвращает particle struct, так почему это недопустимо, если я не заставлю оператора возвращать ссылку:

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

Я не понимаю, почему перегруженная функция уже не возвращает значение lvalue? Пытаясь понять это, я обнаружил, что что-то вроде этого действительно:

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

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

Почему указатель, возвращаемый foo, является допустимым значением lvalue, которое может быть разыменовано и назначено, но не объектом, возвращаемым перегрузкой? Я вижу, что не было бы, если бы я назначил непосредственно к нему, так как я не перегружен =, но я присваиваю одну из его переменных-членов, которая, кажется, должна быть действительной? Мне просто трудно понять, поэтому я ценю всех, кто находит время, чтобы помочь!

0

Решение

Ваш код

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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]