2016-01-22 41 views
2

對於Visual Studio 2015是否支持生成默認移動構造函數,似乎存在衝突的文檔。默認移動構造函數Visual Studio 2015

This linkthis link似乎說不,而this link說是的。

我想簡單的東西:

class Test { 
public: 
    Test(int data) : data(data) {} 
    Test(Test&& other) = default; 
    Test(Test& other) = delete; 
    int data; 
}; 

int main() { 
    Test c(3); 
    std::cout << c.data << std::endl; 
    Test b(std::move(c)); 
    std::cout << b.data << std::endl; 
} 

它打印出3,3預期。我是否犯了一些錯誤或者是實際生成的默認移動構造函數?

編輯:刪除了「隱性」的措辭

+1

在此示例中,您明確要求默認的移動和複製構造函數,即它們不是隱式生成的,所以如果要測試隱式生成的構造函數,那麼程序不會這樣做。 –

+1

錯誤是的,不需要「隱式」部分,我只想知道是否支持默認移動構造函數,我將編輯該問題。 – newprogrammer

+0

第二個鏈接似乎是說[是](https://msdn.microsoft.com/en-us/library/hh567368.aspx#tableguide):*「」Rvalue references v3.0「添加了新的規則來自動生成移動構造函數和移動賦值操作符,這在Visual Studio 2015中實現。「* –

回答

3

正在生成移動構造函數。通過複製實現移動int(將「移動」對象設置爲某個其他值會比僅保持原樣更昂貴)。

您可以使用詳細移動類型作爲數據會員而不是int

2

兩個你說是告訴你鏈接「否」的告訴你「是」。

的Visual Studio 2015年支持defaultdeleted功能。 這在我想的第二個鏈接中已經很清楚地陳述了。

有可能出現的混亂中++使用「默認」一詞的方式下的點點。

在最常見的情況下,我們理解要求默認的是得到你會得到無論如何 - 沒有什麼特別的。

但是在這些情況下,它實際上意味着「重新引入默認執行。

即:

Test(Test&& other) = default; 

並不意味着「做默認的事情就該移動構造函數是提供或基於的類的其他功能沒有提供它的」。

這意味着'確實提供即使它不會(默認)基於類的其他功能所提供的移動構造函數的默認執行。

閱讀=的話說,「這賦予其默認實現」不在這裏「做默認的事情。

我希望有幫助。

+0

第一個鏈接說:」Visual Studio不支持默認的移動構造函數或移動賦值操作符,因爲C++ 11標準要求。「第二個鏈接表示」默認和刪除函數「。 現在支持這些,但有以下例外:對於默認函數,不支持使用= default來請求按成員移動構造函數並移動賦值運算符。「這不意味着不支持默認生成嗎? – newprogrammer

+1

@ newprogrammer我認爲你的代碼顯示了默認的移動構造函數是否已經生成,或者你有另外一種可能的解釋來解釋它編譯的事實嗎?另外,正如我在我的答案中提到的那樣,測試輸出並不是很有意義,唯一的測試是代碼編譯 – juanchopanza

+0

@juanchopanza是的我試着用一個詳細的類型,移動的構造函數肯定是在使用,而不是複製構造函數 – newprogrammer