c++ - 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
将对象从 中插入。vec2
Test
我不知道我应该使用哪种情况,哪种情况更好,哪些情况是错误的。
Ofc,你可能会说我们可以简单地做vec2 = std::move(vec);
,这是正确的,但我想知道如何在 for 循环中移动构造每个元素,而不是移动构造容器。
解决方案
除非有特定原因要编写自己的循环,否则我不会说以上任何一种。相反,我会使用:
std::move(vec.begin(), vec.end(), std::back_inserter(vec2));
至少通过我的阅读,这使得两者都相当明显:
- 你想要完成的事情,以及
- 你真的在做你想做的事。
推荐阅读
- ruby-on-rails - 在 ruby 或 rails 中减去日期
- swift - 从 ObservableObject 发布者更新状态
- rust - 为什么使用Tcplistener传入迭代器时for循环不退出
- python - 谁能告诉我如何在 python 中像所附的那样绘制图表?
- apache-spark - 为什么 Spark 2.4.x 和 scala 2.12 没有 GraphFrames 版本?
- c++ - 为什么在 Ubuntu 中编译时存在的 opencv 文件“没有这样的文件或目录”?
- javascript - 在 PHP/JQUERY 中编辑动态添加的行
- parameterized-query - 什么时候不使用参数化查询是安全的
- php - 在 LinkedIn 上分享按钮
- r - 为 R 中的过去日期添加缺失的行(例如,美国各县的 NYT 冠状病毒病例数据集)