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

时间:2016-08-05 00:13:20

标签: 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);
}

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

error: passing 'const std::map<std::__cxx11::basic_string<char>, DOG_TYPE>' as 'this' argument discards qualifiers [-fpermissive]
         return  dogMap[dogtype];

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

它不起作用,因为std::map没有声明为operator[]的{​​{1}},因此您无法在const上使用operator[]对象。

const std::map定义为将引用返回到键控值。如果未找到密钥,则修改映射以插入密钥的默认值,以便它可以绑定返回的引用。显然,修改std::map::operator[]不起作用,因此编译错误。

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

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

试试这个:

iterator

答案 2 :(得分:1)

正如其他人所说,如果密钥不存在,operator[]会修改地图。

但您可以使用at()

DOG_TYPE getDogType(const std::string& dogtype) 
{
    if(dogMap.find(dogtype) != dogMap.end())
    {
        return  dogMap.at(dogtype);
    }
}

而且,如果getDogType() dogtype dogMap DOG_TYPE getDogType(const std::string& dogtype) { return dogMap.at(dogtype); } 中的某个键不是at(),那么CREATE TABLE FakeTable (NotNullColumn INT NOT NULL); INSERT INTO FakeTable (NotNullColumn) VALUES (NULL); 会引发异常,只需

NULL

p.s。:NOT NULL仅适用于C ++ 11

p.s.2:抱歉我的英语不好。