Использование rvalue ссылки на индекс, какие преимущества? - PullRequest
1 голос
/ 18 апреля 2019

Мне было интересно, есть ли какие-либо возможные преимущества использования ссылочного аргумента rvalue для индексации в объекте контейнера, в отличие от константной ссылки:

Foo::bar(T1&& i, T2&& x)
{
  m_data[i].emplace_back(std::move(x));
}

Где m_data - это std::unordered_map<T1, std::vector<T2>>.Мне кажется более естественным, что i относится к типу const T1&, но я недостаточно знаю семантику перемещения, чтобы знать, имеет ли T1&& какие-либо преимущества или нет (предположим, что T1 и T2 являются тяжелыми типами).

Редактировать: В моем случае T1 - это std::pair<enums, std::string>, а T2 - shared_ptr для пользовательского класса.

1 Ответ

1 голос
/ 18 апреля 2019

При условии, что T1 и T2 являются параметрами шаблона, лучше использовать совершенную пересылку, когда ваши аргументы передаются другим функциям.

Foo::bar(T1&& i, T2&& x)
{
  m_data[std::forward<T1>(i)].emplace_back(std::forward<T2>(x)));
}

Тогда не имеет значения, T1 и T2 - это фундаментальные типы, типы POD или сложные классы.Не имеет значения, переданы ли i и x ссылкой lvalue или ссылкой rvalue.

...