簡體   English   中英

自動移動構造函數

[英]Automatic move constructor

如果我有以下類型:

struct Data
{
    std::string str;
    std::vector<int> vec;
    float f;
private:
    Data(){}
};

並且我沒有定義move構造函數,如果執行以下操作會發生復制嗎?

Data d1;
d1.str = "abc";
d1.vec = {1, 2, 3};
Data d2 = d1;

假設您正在談論這一行:

Data d2 = d1;

由於d1不是右值,因此無論復制都會發生。

您可以改用以下方法:

Data d2 = std::move(d1);

在這種情況下,將發生移動。 由於尚未定義自己的副本構造函數,副本賦值運算符,移動賦值運算符或析構函數,因此您的類將自動獲得move構造函數。

在這種情況下,您將具有復制構造調用,因為兩個對象d1和d2是可以同等訪問的,並且可以分別使用。

僅當編譯器可以保證在移動之后將不可訪問moveable時,才會應用Move構造函數。

該函數的返回值將從r移動:

Data foo() {
  Data r = {1,2,3};
  return r; // will construct retval using move semantic
}

Data t = foo();  

由於r在函數返回后無法訪問。

如果未在類中定義副本構造函數,則編譯器本身將定義一個。 如果該類具有指針變量並具有一些動態內存分配,則必須具有副本構造函數。 參考tutorialPoint

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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