1

这个消息来源说:

[list::back()] 返回对列表容器中最后一个元素的引用。

有人可以验证这绝对意味着它是对实际元素内容list的引用,而不是对最后一个元素的引用,如果扩展,它可能会变成不同的元素。

换句话说,如果列表发生变化,则存储的引用 fromback不会仍然指向 current back,即它不是对 back 的引用,而是back在调用它时存储的内容的引用,对吗?

4

2 回答 2

3

std::list<T>::back被定义为具有以下操作语义:

{ auto tmp = a.end();
  --tmp;
  return *tmp; }

也就是说,它获取最后一个元素的迭代器,然后取消引用它以获取元素本身。然后它以 a 的形式返回std::list<T>::reference,它被定义为T&

所以是的,您在最后一个位置获得了对对象本身的引用。为了让它总是引用最后一个元素,当一个新元素被添加到列表的末尾时,引用必须以某种方式自动更改它所引用的对象,但引用不能被重新绑定。您可能认为解决此问题的一种方法是让新的最后一个元素覆盖前一个最后一个元素和前一个要移动的最后一个元素,但这会使std::lists 迭代器无效。从 a 中插入和擦除std::list被定义为不会使迭代器无效。

于 2013-05-12T13:06:30.420 回答
1

查看有关列表的insertpush_frontpush_back方法的文档

No existing elements are accessed

因此,您可以使用对数据的引用,直到将其从列表中删除。

于 2013-05-12T13:09:21.490 回答