![](/img/trans.png)
[英]c++ why I do not get compile error when I call non const method from ref member inside const method
[英]How do I get the value for a key from a const ref?
為什么我在傳遞給函數的const ref unordered_map中無法獲取鍵的值,但是對於本地unordered_map卻可以呢?
GameObject(const std::unordered_map<int,std::unordered_map<int,int>>& objectParameters){
if (objectParameters.find(CAPABILITY_TYPE_SPECIE)!=objectParameters.end()) {
//Following line gives an error:
auto map2 = objectParameters[CAPABILITY_TYPE_SPECIE];
//Following line works just fine
std::unordered_map<int,std::unordered_map<int,int>> objectParameters2;
auto map = objectParameters2[CAPABILITY_TYPE_SPECIE];
}
為什么無法從objectParameters獲取值? 編譯器抱怨的錯誤是:
類型'const std :: unordered_map>'沒有可行的重載運算符[]
編輯:從類型中刪除“常量”似乎會使錯誤消失。 這是為什么 ?
operator[]
是一個非const成員函數,不能通過const引用在您擁有的對象上調用。 它不能是const成員,因為它被指定為如果鍵不在地圖中則插入一個項目 。 碰巧的是,您甚至不需要使用它。
您使用find()
然后丟棄結果,為什么呢? 如果該項目存在,它將獲得該項目的迭代器。 所以不要丟棄它,使用它。
auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
auto map2 = item->second;
盡管如果您希望map2
與map1
已經存在的相同,則上述方法也不會這樣做。 由於auto map2
是item->second
的副本。 要修改map1
的項目,我們需要將map2
用作參考:
auto item = objectParameters.find(CAPABILITY_TYPE_SPECIE);
if (item != objectParameters.end()) {
auto& map2 = item->second;
關於您的編輯,刪除const以“修復”此類錯誤是錯誤的做法。 常量正確性很重要,當您執行這樣的“修復”操作時,它可能會在代碼中引入一些細微的錯誤。 因為現在不該更改的內容可能開始發生意外更改。
為什么無法從objectParameters獲取值?
因為當使用運算符[]和鍵訪問地圖元素時,該元素將被創建。 顯然,如果map為const
編譯器將無法執行此操作。
您可以嘗試使用.at()
因為它具有const
重載http://en.cppreference.com/w/cpp/container/map/at
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.