考虑下面的代码片段:以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* const
。 f()
需要const int&
参数,这是正确的,因为该参数从不被修改。
不幸的是,这最终试图将const int*
投射到int* const
,它丢失了int上的const限定符并且不会编译。
这是一种刺激性的,因为绝对参数没有修改过 - 它只是用于查找() - 但我仍然需要const_cast
它。
有没有办法写f()
没有const_cast
?
这很不寻常:你为什么使用指针作为映射键? – 2011-04-30 23:08:00
在我的应用程序中,键需要是对重量级对象的引用,并且不能将引用用作映射键。 – AshleysBrain 2011-04-30 23:15:31