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));
至少根据我的阅读,这使得两者相当明显:
- 您想要完成什么,以及
- 你真的在做你想做的事。
我读过这个 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));
至少根据我的阅读,这使得两者相当明显:
- 您想要完成什么,以及
- 你真的在做你想做的事。