Ошибки при передаче объекта по ссылке С++

Я сделал 2 класса У класса есть метод в которой передается ссылка на объект. Ссылка потому что объект большой по размеру и потому что это нужно быстро делать.

class RayTracePack {
public:
    vector<RayTraceInfo>  intersects;
    RayTracePack() {
        intersects.resize(0);
    };
    void append(RayTraceInfo& info) {
        int i;
        if (intersects.size() == 0) {
            intersects.push_back(info);
        }
        else {
            if (info.distance > intersects.back().distance) {
                intersects.push_back(info);
            }
            else if (info.distance < intersects[0].distance) {
                intersects.insert(intersects.begin(), info);
            }
            else {
                for (i = 0; i < intersects.size() - 2; i++) {
                    if (intersects[i].distance < info.distance && intersects[i + 1].distance > info.distance) {
                        intersects.insert(intersects.begin() + i, info);
                    }
                }
            }
        };
    }
};
class RayTraceInfo {
public:
    double shift;
    double distance;
    FlatSprite sprite;
    RayTraceInfo(double shift_, double distance_, FlatSprite& sprite_){
        shift = shift_;
        distance = distance_;
        sprite = sprite_;
    };
};

Я передаю туда значения вот так

// rays :: RayTracePack
point = vision_sprites[i].getIntersection(center, to_point);
FlatSprite sp = vision_sprites[i];
rays.append(RayTraceInfo(vision_sprites[i].getShift(point), sqrt(point.sub(center).mul(point.sub(center)).sum()), sp));

Выдает ошибку:

Ошибка  C2664   "void RayTracePack::append(RayTraceInfo &)": невозможно преобразовать аргумент 1 из "RayTraceInfo" в "RayTraceInfo &"   

Visual Studio 2022 C++ Я новичок в C++ поэтому возможно еще где-то не понимаю ссылки т.д. но вроде все должно работать. Решение проблемы не нашел. Заранее спасибо


Ответы (1 шт):

Автор решения: Harry

Вы передаете l-value

void append(RayTraceInfo& info)

но тут

rays.append(RayTraceInfo(...))

вы передаете временный объект, который по ссылке передавать нельзя.

Варианты решения —

void append(RayTraceInfo info)   
void append(const RayTraceInfo& info)  

Я бы использовал второй вариант...

Еще одно решение

RayTraceInfo r = RayTraceInfo(...);
rays.append(r);

мне категорически не нравится :)

→ Ссылка