我读过这个链接:使用C++11';s的范围基于?,我已经知道为什么我们使用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));
}
如您所见,我正试图使用类Test
的方法moveconstructor将对象从vec
插入到vec2
中。
我不知道我应该使用哪种情况,哪种情况更好,哪些情况是错误的。
Ofc,你可能会说我们可以简单地做vec2 = std::move(vec);
,这是正确的,但我想知道如何在for循环中移动构造每个元素,而不是移动构造容器。
除非有特定的理由编写自己的循环,否则我不会说以上任何一种。相反,我会使用:
std::move(vec.begin(), vec.end(), std::back_inserter(vec2));
至少从我的阅读来看,这两个方面都很明显:
- 你正在努力实现的目标,以及
- 你真的在做你想做的事