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