为什么容器需要const

时间:2019-03-25 20:30:13

标签: c++ for-loop stl

我为什么要购买C2440

for(box& b : uset)
  

错误C2440'正在初始化':无法从'const box'转换为'box&'

     

错误(有效的)E0433限定符在类型的绑定引用中删除   “ box&”类型​​为“ const box”的初始化程序

class box
{
public:
    int i = 1;
    bool operator==(const box& other) const
    {
        return true;
    }
    bool operator!=(const box& other) const
    {
        return !(*this == other);
    }

};

namespace std {

    template<>
    struct hash<box>
    {
        size_t operator()(const box& boxObject) const
        {
            return boxObject.i;
        }
    };
}

int main()
{
    std::unordered_set<box> uset;
    for (box& b : uset)
    {

    }
    return 0;
}

我很困惑,好像我引用了const box一样,问题就消失了。如果我将unordered_set交换为vector,那不是问题。我不确定这是怎么回事。有人可以帮我解释一下吗。这对关联容器来说特别吗?我发现std::set也会发生这种情况。

1 个答案:

答案 0 :(得分:7)

所有关联容器仅提供const对键类型的访问,因此您不能更改它并破坏容器访问元素的方式。那是

decltype(*std::unordered_set<box>{}.begin())

给您一个const box&。您不能将非const引用绑定到const对象,因为这会违反const正确性,因此代码无法编译。

您需要的是

for (box const& b : uset)
{

}

因此您引用了const box

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