Я попытался перегрузить операторы скобок для класса, чтобы сделать доступ к массиву менее утомительным. Чего я не понимаю, так это почему необходимо объявить возвращаемый тип функции перегрузки в качестве ссылки? Почему это не 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, которое может быть разыменовано и назначено, но не объектом, возвращаемым перегрузкой? Я вижу, что не было бы, если бы я назначил непосредственно к нему, так как я не перегружен =
, но я присваиваю одну из его переменных-членов, которая, кажется, должна быть действительной? Мне просто трудно понять, поэтому я ценю всех, кто находит время, чтобы помочь!
Ваш код
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
}
Других решений пока нет …