请原谅我对此主题的不清晰。我正在尝试创建将大类插入向量的函数。在这个例子中,我使用ints作为大类。命名右参考
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> vectorOfVectors;
void fn(const vector<int> &v) {
vectorOfVectors.push_back(v);
}
void fn(vector<int> &&v) {
vectorOfVectors.push_back(std::move(v));
}
int main() {
vector<int> a({1});
const vector<int> b({2});
fn(std::move(a));
fn(b);
cout<<b[0];
}
显然,我希望在可能的情况下不要复制。我的问题:
- 此代码是否正确?
- 有没有更好的方法来做到这一点?
- 对于使用自定义类的相同方法,是否需要定义移动构造函数?
可否请您详细说明“有些情况下是”部分?以及模板如何工作? – SPMP
@ user2308211 - 我将“在某些情况下,是”更改为您的特定情况。推广一下,如果你有一个'f(T&)'和'f(T &&)'除了一个'std :: move'或两个除了'std :: move'之外都是相同的复制粘贴,你应该考虑对一个函数进行templatizing在移动版本的f()中。 –
“模板类型'T'在'v'是一个右值'的情况下成为'vector &&' - 否,在这种情况下'T'只是'vector '。转发参考版本还捕捉太阳下的所有东西(重要的是如果你有重载或需要检查'f(something)'是否格式良好)。最后,如果所讨论的类型移动起来很便宜(比如'vector '),一个更简单的方法是通过值取参数,然后无条件地移动:void f(vectorOfOfVectors.push_back(std ::移动(v)); }'。 –