2014-06-21 53 views
2

這段代碼有什麼問題嗎?爲什麼此片段在VS 2013中不起作用?

#include <memory> 

class Foo { 
}; 

class Bar { 
    std::unique_ptr<Foo> foo_; 
}; 

int main() { 
    Bar bar; 
    Bar bar2 = std::move(bar); 
} 

我得到這個錯誤:

1>c:\users\szx\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\main.cpp(13): error C2280: 'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function 
1>   with 
1>   [ 
1>    _Ty=Foo 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 12.0\vc\include\memory(1486) : see declaration of 'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr' 
1>   with 
1>   [ 
1>    _Ty=Foo 
1>   ] 
1>   This diagnostic occurred in the compiler generated function 'Bar::Bar(const Bar &)' 

但是GCC能夠編譯它沒有錯誤:http://ideone.com/CiDcGI

回答

8

你的代碼是有效的。 VS2013拒絕它,因爲該編譯器不實現移動構造函數和移動賦值運算符的隱式生成。請注意,你甚至不允許明確地默認它們。你唯一的選擇是實現移動構造函數。

class Bar { 
    std::unique_ptr<Foo> foo_; 
public: 
    Bar(Bar&& b) : foo_(std::move(b.foo_)) {} 
    Bar() = default; 
}; 

從MSDN:Support For C++11 Features (Modern C++)

"Rvalue references v3.0" adds new rules to automatically generate move constructors and move assignment operators under certain conditions. However, this is not implemented in Visual C++ in Visual Studio 2013, due to time and resource constraints.

+0

只是作爲一個附加的信息:這是在2013年11月的CTP,這不是一個官方發佈反正固定(模數錯誤)。 –

相關問題