【问题标题】:vector<const int> is not allowed. Why is pair<const int, int> allowed? [duplicate]不允许使用 vector<const int>。为什么 pair<const int, int> 被允许? [复制]
【发布时间】:2012-12-07 17:30:41
【问题描述】:

可能重复:
Why does stack<const string> not compile in g++?

An answer to another question 解释了为什么我们(据说)不能拥有 const 对象的容器。例如,这是不允许的:

vector<const int> v; //not allowed

但是为什么pair 允许第一个对象是const?这确实是pairs 在map 对象中发生的情况。我错过了什么吗?

我们将不胜感激对这种现象的详细和直观的解释。

【问题讨论】:

  • std::pair 不完全是一个容器,是吗?您也可以拥有const int

标签: c++


【解决方案1】:

我认为主要原因是因为std::pair 不会重新分配对象,所以它们不必是可分配的。

更新:

实际上,vector 是唯一需要可分配对象的容器。这是因为根据标准向量,它的元素必须有一个连续的存储位置。因此,如果没有空间添加更多对象,vector 将不得不将其数据重新分配到另一个地方(因此使用对象的 assignable 属性)。

【讨论】:

  • 谢谢。顺便说一句,我对const 的痴迷是因为我不会不小心修改我一开始没有打算修改的东西。在这种情况下,我不想修改容器元素,只添加到容器中。也许我应该开始使用deque 而不是vector
  • @DennisRitchie: const vector&lt;T&gt; 可能是您正在寻找的答案。
  • 我需要能够向容器中添加元素,并且使整个向量 const 不允许这样做,是吗?我只想确保不能更改容器中已有的元素。
  • @DennisRitchie:对不起,我对我的误解深表歉意。如果不想修改向量的元素,可以使用 const 迭代器。在一般情况下,您可能会发现 this article 很有帮助。
【解决方案2】:

std::pair 只需要它的内容是可分配的,如果你试图分配给它。但是,std::vector 始终需要分配以进行重新分配。

【讨论】:

  • 嗯。使用新的移动语义,这仍然适用吗?
  • @NikosC。我想在这种情况下向量只是使用移动赋值,这仍然是一个赋值。不过只是猜测。如果我错了,请有人纠正我。
  • @NikosC 类型必须是可复制或可移动的。因此,例如,您可以拥有一个不可复制的 unique_ptr 向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2017-03-18
  • 2010-11-30
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多