2011-04-30 37 views
5

考虑下面的代码片段:以const走投无路:性病::地图::找到()const的重载

#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的过载采取const KeyType&引起的。由于地图的关键类型为int*,因此这将变为int* constf()需要const int&参数,这是正确的,因为该参数从不被修改。

不幸的是,这最终试图将const int*投射到int* const,它丢失了int上的const限定符并且不会编译。

这是一种刺激性的,因为绝对参数没有修改过 - 它只是用于查找() - 但我仍然需要const_cast它。

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

+1

这很不寻常:你为什么使用指针作为映射键? – 2011-04-30 23:08:00

+0

在我的应用程序中,键需要是对重量级对象的引用,并且不能将引用用作映射键。 – AshleysBrain 2011-04-30 23:15:31

回答

5

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

+0

啊,没有想到 - 谢谢! – AshleysBrain 2011-04-30 23:42:59

7

您可以将map的类型更改为std::map<const int*, int>;不过,我首先问你是否需要指针作为键。正如詹姆斯指出的那样,关键类型应该是const int*,因为你从不打算通过map修改指代物。如果你这样做,我会更加担心。