【问题标题】:Using an rvalue reference to index, any benefits?使用对索引的右值引用,有什么好处吗?
【发布时间】:2019-04-18 01:39:46
【问题描述】:

我想知道使用右值引用参数来索引容器对象而不是 const 引用是否有任何可能的好处:

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

其中m_datastd::unordered_map<T1, std::vector<T2>>。对我来说,i 的类型为 const T1& 似乎更自然,但我对移动语义知之甚少,无法知道 T1&& 是否有任何好处(假设 T1 和 T2 是重类型)。

编辑:在我的用例中,T1 是 std::pair<enums, std::string>,T2 是自定义类的 shared_ptr。

【问题讨论】:

  • 这取决于T1 是什么,但总的来说,没有任何区别。
  • 谢谢!为什么说取决于T1?
  • 因为确实如此。根据 m_data 类型的 operator[] 重载接受的参数,可能会发生也可能不会发生隐式转换。
  • @SamVarshavchik 假设 m_data 是 std::unordered_map
  • @pooya13:你的意思可能是std::unordered_map<T1, std::vector<T2>>(代表emplace_back)。

标签: c++ containers move-semantics rvalue-reference


【解决方案1】:

假设T1T2是模板参数,当你的参数传递给其他函数时最好使用完美转发。

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

那么,T1T2 是基本类型、POD 类型还是复杂类都没有关系。 ix 是通过左值引用还是右值引用传递都没有关系。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 2023-04-07
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多