由const:std :: map :: find()const过载走投无路

时间:2011-04-30 23:06:14

标签: c++ stl map const-correctness

请考虑以下代码段:

#include <map>

class C {
public:
    C() {}

    const int& f(const int& x) const
    {
        // Error: cannot cast const int* to int* const
        return myMap.find(&x)->second;

        // With a const_cast works:
        //return myMap.find(const_cast<int* const>(&x))->second;
    }

    std::map<int*, int> myMap;
};

int _tmain(int argc, _TCHAR* argv[])
{
    int x = 0;

    C c;
    c.f(x);

    return 0;
}

f()中的错误是由地图的find()的常量const KeyType&引起的。由于地图的关键字类型为int*,因此会转为int* constf()采用const int&参数,这是正确的,因为参数永远不会被修改。

不幸的是,最终会尝试将const int*强制转换为int* const,这会丢失int上的const限定符并且不会编译。

这有点令人恼火,因为参数肯定没有被修改 - 它只是用于find() - 但我仍然需要const_cast它。

有没有办法在没有f()的情况下写const_cast

2 个答案:

答案 0 :(得分:7)

您只需将map的类型更改为std::map<const int*, int>;不过,我怀疑你是否需要指针作为键。正如詹姆斯指出的那样,密钥类型应该是const int*,因为你永远不打算通过map来修改指示对象。如果你这样做,我会更加担心。

答案 1 :(得分:5)

真正的问题是:为什么地图的索引不是指针 到const? (当然,假设它应该是一个指针。) 你真的希望能够通过某些东西修改索引吗? 像*myMap.find(&x)->first = xxx;我会说那就是 非常不寻常,因为你已经有一个指针 对象