考虑以下代码:
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
会给我副本或参考吗?
答案 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
(其中It
是it
的类型)。因此,您的情况下*it
的类型为std::pair<const std::string, Info>&
(引用),因此,如果访问其成员first
,您将获得对const std::string
的引用,如下所示:你期望的。
答案 1 :(得分:0)
迭代器保存键/值对。所以-> first将提供一个std :: string作为参考