首页 > 解决方案 > auto & vs auto &&:我们应该在 for 循环中使用哪一个

问题描述

我已阅读此链接:使用 C++11 基于范围的正确方法是什么?,我知道为什么我们使用auto &&循环 a vector<bool>。但我还有一个关于auto &and的问题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));
}

如您所见,我正在尝试使用类的方法move 构造函数vec将对象从 中插入。vec2Test

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

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

标签: c++for-loopc++11moveauto

解决方案


除非有特定原因要编写自己的循环,否则我不会说以上任何一种。相反,我会使用:

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

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

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

推荐阅读