如果我有以下類型:自動轉移構造
struct Data
{
std::string str;
std::vector<int> vec;
float f;
private:
Data(){}
};
,我不定義移動構造函數,如果我下面的一個副本會怎樣呢?
Data d1;
d1.str = "abc";
d1.vec = {1, 2, 3};
Data d2 = d1;
如果我有以下類型:自動轉移構造
struct Data
{
std::string str;
std::vector<int> vec;
float f;
private:
Data(){}
};
,我不定義移動構造函數,如果我下面的一個副本會怎樣呢?
Data d1;
d1.str = "abc";
d1.vec = {1, 2, 3};
Data d2 = d1;
在這種情況下,您將有複製構造調用,因爲兩個對象d1和d2可以同等訪問並可以單獨使用。
移動構造函數只有在編譯器可以保證移動後不能移動的情況下才會應用。
函數的返回值將從r被構造舉動:
Data foo() {
Data r = {1,2,3};
return r; // will construct retval using move semantic
}
Data t = foo();
爲r不能在函數返回時被訪問。
如果複製構造函數未在類中定義,則編譯器自己定義一個。如果類有指針變量並且有一些動態內存分配,那麼必須有一個拷貝構造函數。 reference tutorialPoint
請參閱http://en.cppreference.com/w/cpp/language/move_constructor#Implicitly-declared_move_constructor – dewaffled