为什么容器需要const [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

为什么我会买一台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

c++ for-loop stl
1个回答
7
投票

所有关联容器只提供对密钥类型的const访问,因此您无法更改它并破坏容器访问元素的方式。这意味着

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

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

你需要的是什么

for (box const& b : uset)
{

}

所以你有一个const box的参考。

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

© www.soinside.com 2019 - 2024. All rights reserved.