考虑以下代码段:
#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* const
。 f()
接受一个const int&
参数,这是正确的,因为该参数永远不会被修改。
不幸的是,这最终导致尝试将 a 强制const int*
转换为 a int* const
,这会丢失 int 上的 const 限定符并且不会编译。
这有点烦人,因为参数绝对没有被修改过——它只是用于 find()——但我仍然需要const_cast
它。
有没有办法写f()
没有const_cast
?