[英]Cornered by const: std::map::find() const overload
考慮以下代碼段:
#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 的find()
采用const KeyType&
的 const 重載引起的。 因為 map 的密鑰類型是int*
,所以這變成了int* const
。 f()
接受一個const int&
參數,這是正確的,因為該參數永遠不會被修改。
不幸的是,這最終導致嘗試將const int*
轉換為int* const
,這會丟失 int 上的 const 限定符並且不會編譯。
這有點煩人,因為參數絕對沒有被修改過——它只是用於 find()——但我仍然需要const_cast
它。
有沒有辦法在沒有const_cast
的情況下編寫f()
?
您只需將map
的類型更改為std::map<const int*, int>
; 不過,我質疑您是否首先需要指針作為鍵。 正如 James 指出的那樣,鍵類型應該是const int*
因為您從不打算通過map
修改所指對象。 如果你這樣做了,我會更加擔心。
真正的問題是:為什么 map 的索引不是指向 const 的指針? (當然,假設它應該是一個指針。)您真的希望能夠通過*myMap.find(&x)->first = xxx
之類的東西來修改索引嗎? 我會說這很不尋常,因為您已經有了指向 object 的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.