STL容器元素销毁顺序

28

ISO C++标准是否规定了STL容器中对象的销毁顺序?

  • std::list/std::vector/std::map中的元素是从容器的开头还是结尾开始销毁的?
  • 我可以依赖于std::map在其内部存储元素时使用std::pair,所以一个键在其值之前被销毁(反之亦然)吗?

可能没有明确说明,但对于std::list来说,肯定是按顺序或按相反顺序排列的,因为没有其他方法可以遍历元素(而不进行额外的工作)。 - alfC
2个回答

24
  1. 在标准中未指定。
  2. 是的,但这意味着键在其关联值之后被销毁。

没错,就是我想表达的意思,应该写反了。你能告诉我标准中具体规定了 #2 的哪一部分吗? - Alex B
20.2.2/1,这与我对Terry答案的评论有关。 - Roger Pate
@Roger Pate:请将它包含在答案中,我会接受它。 :) - Alex B

5
  1. 未指定
  2. 是的,你可以依赖于std::map将其元素存储在std::pair中,但我没有看到任何规定在值部分之前销毁std::pair的键部分。

3
该标准规定了第一第二数据成员,并按照这个顺序展示它们,如果需要这个顺序,那么也就决定了构造和析构的顺序。 - Roger Pate
我找不到明确说明顺序是必需的,但也没有说允许顺序不同。由于它们是公共成员,绝对没有标记为“仅供展示”,因此不允许实现的其他条款都不适用。因此,我认为这个顺序是必需的。 - Roger Pate
查看草案C++0x标准,似乎该标准要求在构造“second”之前必须先构造“first”。具体来说,20.3.3.4 pair(); Effects: Initializes its members as if implemented: pair() : first(), second() {}。我理解这意味着顺序是定义好的,但我会听从语言律师的意见。 - R Samuel Klatchko
2
@RSK:20.2.2/1 是一个更强的排序要求 - 初始化列表中的顺序不会影响(不幸的是)也不需要匹配实际的初始化顺序,这由类成员声明指定。 - Michael Burr
3
构造函数初始化列表中的顺序并不重要,成员声明的顺序才决定了初始化顺序。当前标准中的20.2.2/2节也包含了几乎相同的文本。 - Roger Pate
@MichaelBurr,销毁顺序被指定为与初始化顺序相反,对吗? - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接