請原諒我對此主題的不清晰。我正在嘗試創建將大類插入向量的函數。在這個例子中,我使用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)); }'。 –