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

问题描述

我已阅读此链接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 中的对象插入到 Test 中。

我不知道我应该使用哪种情况,哪种情况更好,哪些情况是错误的。

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

解决方法

除非有特定的理由来编写自己的循环,否则我不会说以上任何一个。相反,我会使用:

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

至少通过我的阅读,这使得两者都相当明显:

  1. 您正在努力实现的目标,以及
  2. 你真的在做你想做的事。