我正在为C ++中的单链表编写一个模板,我对在删除第一个节点时返回第一个节点信息的正确方法感到困惑。
我从一本书中获得了一些帮助,其中有两个方法,一个返回头节点的值,另一个删除它。让我们调用方法front()和pop(),其中front()返回值为" const T&"类型。我的一个问题是,如果我做这样的事情:
T object = list.front();
list.pop();
不会导致对象引用指向什么?如果我在调用pop()后继续使用该对象有什么问题吗?
第二个问题是,使用front()方法的正确方法是什么,以及它们之间的区别:
T object = list.front();
// or
T& object = list.front();
// or
const T& object = list.front();
答案 0 :(得分:3)
如果你这样做
T object = list.front();
和front()
返回T&
,然后object
成为列表初始元素的副本,而不是对它的引用。
另一方面,如果你写了
const T& ref = list.front();
然后调用list.pop()
会使ref
成为悬空引用,这与内存泄漏不同。
这应该解释你的第一个和第三个例子之间的区别;你的第二个例子,即
T& object = list.front();
无法编译,因为无法从const
引用构建非const
引用。
答案 1 :(得分:2)
对于T object = list.front();
,object
是list.front()
的副本,然后与原始元素无关。所以list.pop()
根本没有任何影响。
对于T& object = list.front();
,您无法做到这一点。 const T&
无法隐式转换为T&
。
对于const T& object = list.front();
,object是对list
中元素的引用。所以在list.pop()
之后它会悬空。