c++ - 非常量左值引用

标签 c++ pointers reference this rvalue

每次将邻居A添加到节点B时,我都要创建一个无向图。我也必须将节点B添加为A的邻居,但是我的方法行不通。
Non-const lvalue reference to type 'Element *' cannot bind to a temporary of type 'Element *'

class Element
{
    std::vector<Element *> m_neighbours;
private:

public:
    void addNeighbour(Element*& neighbour)
    {
        m_neighbours.push_back(neighbour);
        neighbour->addNeighbour(this);
    }
};
  • 发生了什么事?
  • 解决的最佳方法?
  • 最佳答案

    为了理解问题所在,让我们假设您编写了以下代码:

    void addNeighbour(Element*& neighbour)
    {
        m_neighbours.emplace_back(neighbour);
        neighbour->addNeighbour(this);
        neighbour = nullptr; // <--- This is new
    }
    

    现在,考虑一下进行此调用时会发生什么:
    neighbour->addNeighbour(this);
    

    对该函数的调用按引用传递this,意思是“请随时重新分配this”。然后,在函数调用中,实际上,最后一行试图将neighbour重新分配给nullptr。但这是一个问题,因为你不会写
    this = nullptr; // Error!
    

    因为this是一个右值。

    最简单的解决方法是不通过引用获取参数,因为在实际需要引用的地方您无需对其进行任何操作。只需输入一个Element*,说“请把您感兴趣的指针的副本交给我”。

    (独立地-您的代码会给您带来麻烦,因为调用A->addNeighbour(B)会调用B->addNeighbour(A),后者会调用A->addNeighbour(B),然后会调用B->addNeighbour(A),等等。直到您耗尽调用堆栈。您应该在此处添加一个检查以确保如果Element已被记录,则无需再次添加。为此,您可能希望将m_neighbours设为std::unordered_set而不是std::vector。)

    关于c++ - 非常量左值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61066344/

    相关文章:

    c++ - 如何获取UTC时间

    c - 为什么下面的代码输出相同的地址?

    c++ - 在C++中,如何根据运行时条件构造引用不同istream对象的对象?

    c++ - For循环不会在没有return语句的int函数中终止

    c++ - 从未知指针转换为类;如何检查有效性?

    c++ - 遇到内存泄漏问题 - 在 std::map 中重新绑定(bind)键

    Java-ArrayList引用变量问题

    c - 如何创建函数,在 C 中没有 typedef 的情况下返回指向另一个函数的指针?

    c - 为什么我使用指针的指针来维护二维数组,但在 C 中却遇到了段错误?

    c++ - 混淆的引用输出,如何分析?