2014-10-27 83 views
10

我已經能夠在過去找到關於此的多個對話(例如here),但此類對話來自不久前。我有一個問題有關的代碼是:Visual Studio 2013中的默認移動構造函數(更新3)

#include <utility> 
#include <iostream> 

struct Foo 
{ 
    Foo() = default; 
    Foo(const Foo &o) 
    { 
     std::cout << "copy" << std::endl; 
    } 
    Foo(Foo &&o) 
    { 
     std::cout << "move" << std::endl; 
    } 
}; 

struct Bar 
{ 
    Foo foo; 
}; 

int main(void) 
{ 
    Bar a; 
    Bar b(a); 
    Bar c(std::move(a)); 
} 

如果您執行在Visual Studio 2013(更新3)的代碼,它打印出「複製」兩種情況。如果自從上述鏈接中的答案之後標準沒有改變,則輸出應該是「複製」,然後是「移動」。 Ideone似乎給出了正確的輸出。這只是Visual Studio尚未實現的東西,還是在我的代碼中缺少某些內容? I know that you cannot mark move constructors as default,但這並不意味着編譯器不支持全部生成默認移動構造函數。

回答

17

我知道你不能標誌移到構造函數爲默認值,但這並不意味着該編譯器不支持生成默認的舉動構造全在一起

不幸的是,這也正是這意味着什麼。 VS2013不支持隱式生成移動構造函數和移動賦值操作符。如果是這樣,他們真的沒有理由不允許使用= default語法,尤其是因爲您可以爲複製構造函數和賦值運算符這樣做。

引述MSDN:Support For C++11 Features (Modern C++)

「右值引用V3.0」 增加了新的規則自動生成move構造函數和在一定條件下移動賦值運算符。但是,由於時間和資源限制,Visual Studio 2013中的Visual C++沒有實現這個功能。

+1

令人失望。我還發現[這個圖表](http://blogs.msdn.com/b/somasegar/archive/2013/06/28/cpp-conformance-roadmap.aspx),所以它看起來像vNext應該實現它。看起來我有一些代碼現在去修改... – Duncan 2014-10-27 05:13:13

+14

這很糟糕。 – 2014-12-21 06:14:14

+0

似乎它不會在VS2015實施... – 2015-06-08 20:10:52