在c++中,当map指针被更改为值时,抛出限定符错误

discard qualifiers error when in C++ with map pointer is changed as value

本文关键字:错误 c++ map 指针      更新时间:2023-10-16

我有这个(简化的)代码可以正常工作。

class T
{
    map<string, int>* m;
public:    
    T()
    {
        m = new map<string, int>();
    }
    void get(const string& key, int& val) const
    {
        val = (*m)[key];
    }
}

当我把指针改成value时,

class T
{
    map<string, int> m;
public:    
    void get(const string& key, int& val) const
    {
        val = m[key];
    }
};

我得到这个错误信息,是什么错了?

In member function 'void T::get(const string&, int&) const':
constTest.cpp:12:20: error: passing 'const std::map<std::basic_string<char>, int>' 
as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& ...' 
discards qualifiers [-fpermissive]
         val = m[key];
                    ^

由于get方法是const,所以包括m在内的所有数据成员都被视为常量。然而,map上的[]运算符是而不是常数。使用at方法代替,它有一个const重载:

val = m.at(key);

const方法中,第一个容器的类型实际上变成了map<string, int>* const (指针是const,而指针不是)。第二个容器的类型变为const map<string, int>

operator[]要求对象为非const,因为如果找不到新元素,它可能必须进行变异才能添加新元素。因此,在第一种情况下,解引用指针仍然指向const函数中的非const容器,而在第二种情况下,容器本身被视为const。

如果您要查找的键不存在,您希望发生什么?如果你想创建它,你的get函数不能是const。

如果你不希望它被创建,然后使用地图的find方法找到你想要的项目(或end(),如果它不能被找到,然后决定合适的行为)。