2016-02-28 51 views
0

如果我有以下類型:自動轉移構造

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; 
+0

請參閱http://en.cppreference.com/w/cpp/language/move_constructor#Implicitly-declared_move_constructor – dewaffled

回答

3

假設你是在談論這一行:

Data d2 = d1; 

副本將不論發生,因爲d1不是一個右值。

您可以使用它代替:

Data d2 = std::move(d1); 

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

+0

什麼是'd1'是我做的一個函數返回的臨時數據d2 = std :: move (d1);' – Narek

+0

@Narek,如果你的'd1'已經是一個右值,你不需要'std :: move' – ixSci

2

在這種情況下,您將有複製構造調用,因爲兩個對象d1和d2可以同等訪問並可以單獨使用。

移動構造函數只有在編譯器可以保證移動後不能移動的情況下才會應用。

函數的返回值將從r被構造舉動:

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

Data t = foo(); 

爲r不能在函數返回時被訪問。

1

如果複製構造函數未在類中定義,則編譯器自己定義一個。如果類有指針變量並且有一些動態內存分配,那麼必須有一個拷貝構造函數。 reference tutorialPoint