->先给什么类型?

时间:2019-06-19 07:41:42

标签: c++ c++17 unordered-map

考虑以下代码:

  static std::unordered_map<std::string, Info> stringCollection;

  auto& [it, inserted] = stringCollection.try_emplace(pString);
  if (inserted) {
    it->second.str = &it->first;
  }
  return it->second;

此行it->second.str = &it->first应该复制密钥(指针)的地址-但我似乎无法验证是否会出现这种情况(找不到引用)。基本上it->first会给我副本或参考吗?

2 个答案:

答案 0 :(得分:7)

您要删除&之后的auto,因为try_emplace不返回引用:

auto [it, inserted] = stringCollection.try_emplace(pString);

在这种情况下,it的类型为std::unordered_map<std::string, Info>::iterator,它满足LegacyForwardIterator的含义,即LegacyInputIterator

  • it->m等效于(*it).m;
  • *it返回std::iterator_traits<It>::reference(其中Itit的类型)。

因此,您的情况下*it的类型为std::pair<const std::string, Info>&(引用),因此,如果访问其成员first,您将获得对const std::string的引用,如下所示:你期望的。

答案 1 :(得分:0)

迭代器保存键/值对。所以-> first将提供一个std :: string作为参考