簡體   English   中英

被 const 逼入絕境:std::map::find() const 重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM