请考虑以下示例:
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?
它不起作用,因为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)