auto & vs auto &&:我们应该在 for 循环中使用哪一个

auto & vs auto &&: Which one should we use in a for loop

我读过这个 link:What is the correct way of using C++11's range-based for?,我知道为什么我们使用 auto && 来循环 vector<bool>。但我还有一个关于 auto &auto && 的问题。

class Test {};
vector<Test> vec = {Test{}, Test{}, Test{}};
vector<Test> vec2;
// case 1
for (auto &element : vec) {
    vec2.emplace_back(element);
}
// case 2
for (auto &element : vec) {
    vec2.emplace_back(std::move(element));
}
// case 3
for (auto &&element : vec) {
    vec2.emplace_back(element);
}
// case 4
for (auto &&element : vec) {
    vec2.emplace_back(std::move(element));
}

如您所见,我正在尝试使用 移动构造函数 的方法将对象从 vec 插入到 vec2 30=] Test.

不知道应该用哪个case,哪个case好,哪个case不对

Ofc,您可能会说我们可以简单地做 vec2 = std::move(vec);,这是正确的,但我想知道如何在 for 循环中移动构造每个元素,而不是移动构造容器。

除非有特殊原因要编写您自己的循环,否则我会说上面的 none。相反,我会使用:

std::move(vec.begin(), vec.end(), std::back_inserter(vec2));

至少根据我的阅读,这使得两者相当明显:

  1. 您想要完成什么,以及
  2. 你真的在做你想做的事。