[英]Does the move constuctor of std::vector call the move constructor of the items
[英]Does move constructor have to call std::move()?
我在我們的項目中遇到了一些如下代碼:
class A {
public:
A(A&& obj): valid_(false), data_(obj.data_) {}
//...
void print() {
for (auto x : data_) cout<<x<<" ";
cout<<endl;
}
private:
bool valid_;
vector<int> data_;
};
這是move構造函數的有效實現嗎? 在這種情況下,是否必須在移動構造函數中將std::move()
用於成員變量?
重要的是要記住,“ lvalue”和“ rvalue”以及其他“ * values”的形式並不適用於變量,而適用於表達式 。
表達式obj.data_
是一個左值表達式,最簡單的查看方法是認為&obj.data_
格式正確,而采用右值表達式的地址則不然。
要允許應用移動語義,您必須獲取此左值表達式的結果,並通過std::move
對其進行強制轉換,以便它是一個右值表達式,該值實際上適用於移動語義(對於任何data_碰巧的類型)。
因此,是的,您必須應用std::move
。
您需要將data_(obj.data_)
更改為data_(std::move(obj.data_))
,否則它將被復制構造; 除非顯式移動(或在適當條件下轉發),否則命名變量絕不是r值引用; C ++不會隱式地將move
傳遞地應用於對象屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.