C++ 混乱的返回引用

C++ 混乱的返回引用,c++,C++,我有这两个功能 int FEL::enqueue(Event& new_event){ getting a reference of an event and add it to an Event array, defined as "Event *event_list" } Event FEL::dequeue(){ Event old_root = event_list[0]; event_list[0] = event_list[--event_inde

我有这两个功能

int FEL::enqueue(Event& new_event){
     getting a reference of an event and add it to an Event array, defined as "Event *event_list"
}

Event FEL::dequeue(){
    Event old_root = event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
    return old_root;
}
它工作得很好,但我想修改它,以便在出列函数中获得更好的性能。 因为dequeue函数返回事件,所以我认为如果只返回事件的引用而不是整个事件结构,可能会更好

如何更改dequeue函数的返回类型以返回事件的引用? 我想我可以这样做来返回指针,但是如何返回事件的引用(&)

Event* FEL::dequeue(){
    Event *old_root = &event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
    return old_root;
}

返回指针将不起作用,因为您正在修改
事件列表[0]
,并且
旧的\u根
是指向该对象的指针,因此它将指向新值而不是旧值。至于返回引用,您也不能,因为返回的值必须是类的成员(或类成员的元素等),如果这样做,您将得到新值,而不是旧值

如果要返回旧值,唯一的解决方案是按值返回。不过,情况可能没有你想象的那么糟。大多数编译器都可以应用返回值优化,这意味着不会复制对象。此外,如果对象包含任何分配的存储,它可以从C++11上的移动语义中获益

编辑:对不起,当然还有另一种方法

void FEL::dequeue(Event *old){
    *old = event_list[0];
    event_list[0] = event_list[--event_index];
    resort_heap(0);
}

请注意,由于前面提到的优化,这可能是过早的优化出错。

嗯,您不能返回对覆盖或删除的内容的引用。那怎么行?返回副本似乎是最明智的方法。或者只使用标准的库容器。