为什么此代码段在VS 2013中不起作用?

时间:2014-06-21 20:50:48

标签: c++ c++11 unique-ptr

这段代码有什么问题吗?

#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

1 个答案:

答案 0 :(得分: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++)

  

&#34; Rvalue引用v3.0&#34;添加新规则以自动生成移动构造函数并在特定条件下移动赋值运算符。但是,由于时间和资源限制,Visual Studio 2013中的Visual C ++中未实现此功能。