考虑以下示例:
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
?
答案 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:抱歉我的英语不好。