为什么当map是const static时,以下内容不起作用

Jam*_*nco 1 c++ c++11

请考虑以下示例:

enum class DOG_TYPE {SHEPHARD, COLLIE,UNKNOWN};

static  const std::map<std::string,DOG_TYPE> dogMap = {
                {"GS",DOG_TYPE::SHEPHARD}
};


DOG_TYPE getDogType(const std::string& dogtype) 
{
    if(dogMap.find(dogtype) != dogMap.end())
    {
        return  dogMap[dogtype];  -->Does not work when std::map is constant
    }
}

int main()
{
DOG_TYPE j = getDogType("GS");
std::cout << int(j);
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,该语句return dogMap[dogtype];返回错误

error: passing 'const std::map<std::__cxx11::basic_string<char>, DOG_TYPE>' as 'this' argument discards qualifiers [-fpermissive]
         return  dogMap[dogtype];
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会发生这种情况以及为什么不能映射const static

Dav*_*rtz 7

如果对象不存在,则使用operator[]on std::map创建对象.所以这是一个只能在你允许修改的地图上执行的操作.请改用find.


Rem*_*eau 5

它不起作用,因为std::map没有operator[]声明为const,所以你不能operator[]const std::map对象上使用.

std::map::operator[]被定义为返回对键控值的引用.如果未找到密钥,则会修改映射以插入密钥的默认值,以便它可以绑定返回的引用.显然,修改一个const std::map不能正常工作,因而编译错误.

要执行您尝试的操作,您可以使用std::map::find()搜索键而不为其插入新值.如果找到密钥,则可以取消引用返回的密钥iterator.

如果找不到密钥,请不要忘记让函数返回默认值.

试试这个:

DOG_TYPE getDogType(const std::string &dogtype) 
{
    auto iter = dogMap.find(dogtype);
    if (iter != dogMap.end())
        return iter->second;
    return DOG_TYPE::UNKNOWN;
}
Run Code Online (Sandbox Code Playgroud)