簡體   English   中英

move構造函數是否必須調用std :: move()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM