vector<const int>不被允许。为什么pair<const int, int>被允许?

8

可能是重复问题:
为什么stack<const string>在g++中不能编译?

另一个问题的答案 解释了为什么我们(据说)不能有包含const对象的容器。例如,下面的代码是不允许的:

vector<const int> v; //not allowed

但是为什么一个 pair 允许第一个对象是 const?这正是 map 对象内部的 pair 所发生的。我错过了什么吗?
详细和直观地解释这种现象将会非常感激。

std::pair 不完全是一个容器,对吧?你也可以有一个 const int - Bo Persson
2个回答

18

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

更新:

实际上,只有vector容器需要可分配的对象。这是因为标准规定vector必须为其元素拥有连续的存储位置。因此,如果没有足够的空间添加更多对象,vector将不得不将其数据重新分配到另一个位置(从而使用对象的可分配属性)。


1
顺便说一下,我对const的痴迷是为了避免意外修改我原本不打算修改的东西。在这种情况下,我只想添加到容器中而不修改容器元素。也许我应该开始使用deque而不是vector?谢谢。 - Dennis Ritchie
@DennisRitchie:const vector<T> 可能是你正在寻找的答案。 - prazuber
我需要能够向容器中添加元素,而将整个向量设为 const 会阻止这一操作,是吗?我只想确保无法更改已经在容器中的元素。 - Dennis Ritchie
2
@DennisRitchie:对不起,我对我的误解深感抱歉。如果您不想修改向量元素,可以使用const迭代器。在一般情况下,您可能会发现这篇文章很有帮助。 - prazuber

7

std::pair只需要在尝试进行赋值时其内容可被分配。然而,std::vector总是需要分配来重新分配空间。


嗯,有了新的移动语义,这个还成立吗? - Nikos C.
@NikosC。我猜向量在这种情况下只使用移动赋值,这仍然是一种赋值。不过这只是我的猜测,如果我错了,请有人纠正我。 - Dennis Ritchie
1
@NikosC 类型必须是可复制或可移动的。例如,您可以拥有一个 unique_ptr 的向量,它们不可复制。 - nunojpg

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