C++ 引用可以代替指针吗?

C++ 引用可以代替指针吗?,c++,linked-list,C++,Linked List,更具体地说,我想知道为什么我们在典型的链表实现中使用指针。以下节点实现是否会导致任何问题 template <typename T> class Node { T data; Node<T>& next; Node<T>& prev; }; 模板 类节点{ T数据; Node&next; 节点&prev; }; 有什么理由我们应该在这里使用指针而不是引用吗?创建引用后不能设置引用,这使得不可变的链表实现有些棘手。(需

更具体地说,我想知道为什么我们在典型的链表实现中使用指针。以下节点实现是否会导致任何问题

template <typename T>
class Node {
    T data;
    Node<T>& next;
    Node<T>& prev;
};
模板
类节点{
T数据;
Node&next;
节点&prev;
};

有什么理由我们应该在这里使用指针而不是引用吗?

创建引用后不能设置引用,这使得不可变的链表实现有些棘手。(需要将引用包装在对象中,以便在需要更改引用时可以重新装箱)

也无法在引用上设置空值,因此表示列表的结尾需要一些想象力


最好还是坚持使用链表中的指针,或者更好,使用
std::list

左值引用不能代替指针;他们做不同的事情

左值引用必须用左值初始化,并且左值引用将在其剩余生命周期中引用该对象。这是不可能的。这给列表节点带来了两个直接的问题

你是如何开始这份清单的?您想要构造一个没有“previous”的节点,但是
prev
成员必须用
节点
对象初始化。可以想象,可以使用一个
节点
,它的
prev
本身代表列表的头部,但这是在解决左值引用选择不当的问题。(例如,
Node-emptylist={T(),emptylist,emptylist};//eurgh


第二,如何操作列表?您不能更改
next
prev
的绑定,这意味着更改列表的唯一方法是构造一组全新的节点,并复制每个
数据
元素。

如果下一个或上一个节点不可用怎么办?此列表实现在我的图灵机上非常有效。引用不能为空,因此,您需要某种表示无效/不存在的“next”和/或“prev”的方法。如果您想要一个无限列表,那么这种方法是可行的:p理论上,您不能只在列表的末尾创建一个常量null节点来指向它吗?注意,不要暗示这是个好主意!“引用必须用左值初始化”--嗯。。。不是真的<代码>int const&cr=5;int&rv=5
或者更好的方法是,不要使用链表,除非你只是想了解指针是如何工作的。。。