为什么使用迭代器这种方式有效?

时间:2017-07-19 12:44:57

标签: c++ stl

这是一个最小的代码,以便重新创建让我怀疑的条件:

#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]

1 个答案:

答案 0 :(得分:11)

原因很简单:it const 迭代器,因此it->secondconst std::string,你不能在其上调用非const方法。

当你处理:

auto u = it->second;

auto推断为std::stringuit->second初始化。由于u是非const std::string,因此您可以自由地调用const和非const方法。