Какой тип это -> первый? - PullRequest
2 голосов
/ 19 июня 2019

Рассмотрим следующий код:

  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 ]

7 голосов
/ 19 июня 2019

Вы хотите удалить & после 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, как и ожидалось.

0 голосов
/ 19 июня 2019

Итератор содержит пару ключ / значение.Итак -> first даст std :: string как ссылку

...