C++ 为什么容器需要const

C++ 为什么容器需要const,c++,for-loop,stl,C++,For Loop,Stl,为什么我要买一辆C2440 for(box& b : uset) 错误C2440“初始化”:无法从“常量框”转换为“框&” 类型的绑定引用中删除了活动E0433限定符时出错 box&指向const-box类型的初始值设定项 我很困惑,好像我把它作为一个常量框的参考,然后问题就消失了。如果我把无序的_集换成向量,那就没问题了。我不知道这里发生了什么。有人能帮我解释一下吗。这是关联容器特有的吗?我发现std::set也会出现这种情况。所有关联容器都只提供对键类型的常量访问,因此您不能更改它

为什么我要买一辆C2440

for(box& b : uset)
错误C2440“初始化”:无法从“常量框”转换为“框&”

类型的绑定引用中删除了活动E0433限定符时出错 box&指向const-box类型的初始值设定项


我很困惑,好像我把它作为一个常量框的参考,然后问题就消失了。如果我把无序的_集换成向量,那就没问题了。我不知道这里发生了什么。有人能帮我解释一下吗。这是关联容器特有的吗?我发现std::set也会出现这种情况。

所有关联容器都只提供对键类型的常量访问,因此您不能更改它,也不能中断容器访问元素的方式。这意味着

decltype(*std::unordered_set<box>{}.begin())
所以你有一个常量框的引用


向量没有这个问题,因为向量不关心元素的值。它通过索引而不是元素的值进行访问,因此更改元素的值不会破坏任何内容。

您不能修改集合中的元素,只能插入和删除它们。取消对集合迭代器的引用会给你常量对象。@HolyBlackCat这是一个答案,不是注释IMHO。@Holy说的是对的。这是因为改变元素可能会打乱它们的顺序/散列。
decltype(*std::unordered_set<box>{}.begin())
for (box const& b : uset)
{

}