这是一个最小的代码,以便重新创建让我怀疑的条件:
#include <map>
#include <string>
int main()
{
std::map<std::string, std::string> mm;
mm.emplace("Hi", "asd");
mm.emplace("Hey", "asd");
mm.emplace("Hello", "asd");
std::map<std::string, std::string>::const_iterator it = mm.find("Hey");
it->second.size();
// A
//it->second.replace(0,1,"h");
//B
auto u = it->second;
u.replace(0,1,"h");
}
为什么在A
的情况下将常量作为参数传递出错,但在B
的情况下有效?
错误详情:
错误:将'const std :: basic_string'作为'this'参数传递给 'std :: basic_string&lt; _CharT,_Traits,_ Alloc&gt;&amp;的std :: basic_string的&LT; _CharT, _Traits,_Alloc&gt; :: replace(std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: size_type,std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: size_type,const _CharT *)[with _CharT = char; _Traits = std :: char_traits; _Alloc = std :: allocator; std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: size_type = long unsigned int]'丢弃限定符[-fpermissive]
答案 0 :(得分:11)
原因很简单:it
是 const 迭代器,因此it->second
是const std::string
,你不能在其上调用非const方法。
当你处理:
auto u = it->second;
auto
推断为std::string
,u
从it->second
初始化。由于u
是非const std::string
,因此您可以自由地调用const和非const方法。