5

考虑以下代码段:

#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()是由 map 的 const 重载导致find()const KeyType&。因为地图的键类型是int*,所以变成int* constf()接受一个const int&参数,这是正确的,因为该参数永远不会被修改。

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

这有点烦人,因为参数绝对没有被修改过——它只是用于 find()——但我仍然需要const_cast它。

有没有办法写f()没有const_cast

4

2 回答 2

7

您可以将类型更改mapstd::map<const int*, int>; 不过,我质疑您是否首先需要指针作为键。正如 James 指出的那样,关键类型应该是const int*因为您从不打算通过map. 如果你这样做了,我会更加担心。

于 2011-04-30T23:19:42.360 回答
5

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

于 2011-04-30T23:23:05.347 回答