在 pair.first 上使用 std::move 会使 pair.second 无效吗?

Does using std::move on pair.first invalidate pair.second?

目前我的项目中有以下代码:

std::vector<int> vectorOfFirsts;
std::set<double> setOfSeconds;
std::list<std::pair<int,double>> cachedList;
// do something to fill the list 
for (const auto& pair : cachedList)
{
   vectorOfFirsts.push_back(pair.first);
   setOfSeconds.insert(pair.second);
}

这个列表会很大,只需要填充vector和set(即内容可以无效)。我现在的问题是,如果以下优化是个好主意:

 for (const auto& pair : cachedList)
 {
       vectorOfFirsts.push_back(std::move(pair.first));
       setOfSeconds.insert(std::move(pair.second));
 }

在 pair.first 上调用 std::move 是否会以某种方式使 pair.second 无效?这段代码会为循环提供任何加速吗?我知道填充 vector/set 而不是列表可能是个好主意,但列表是通过一些遗留代码填充的,我无法控制/没有时间深入研究。

Will calling std::move on pair.first somehow invalidate pair.second?

没有。 firstsecond 是完全不同的变量,恰好驻留在某些 class 对象中。移动一个不影响另一个。

And will this code provide any speedup for the loop?

这取决于类型。 move-ing 的目的基本上是转移资源。由于这里的pairs是ints和doubles,不涉及资源,所以没有什么可以转移的。如果它是一对矩阵类型和张量类型,每个都有一些内部动态分配的缓冲区,那么它可能会提高性能。

停止。

花点时间考虑一下这段代码。内嵌评论

// step one - iterate through cachedList, binding the dereferenced
// iterator to a CONST reference
for (const auto& pair : cachedList)
{
  // step 2 - use std::move to cast the l-value reference pair to an
  // r-value. This will have the type const <pairtype> &&. A const
  // r-value reference.
  // vector::push_back does not have an overload for const T&& (rightly)
  // so const T&& will decay to const T&. You will copy the object.
  vectorOfFirsts.push_back(std::move(pair.first));

  // ditto
  setOfSeconds.insert(std::move(pair.second));
 }

需要是:

for (auto& pair : cachedList)
{
  vectorOfFirsts.push_back(std::move(pair.first));
  setOfSeconds.insert(std::move(pair.second));
}

是的,这将成为移动的有效和合法使用。