iouvxz iouvxz - 1 year ago 54
C++ Question

C++ Why adding a destructor to my class makes my class unmovable?

The compiler reminds me that I'm using a deleted function .

#include <memory>
using namespace std;
class foo
unique_ptr<int> p;

int main()
foo a, b;
a = move(b);
return 0;

compilation info

prog.cpp: In function 'int main()':
prog.cpp:15:4: error: use of deleted function 'foo& foo::operator=(const foo&)'
a = move(b);

prog.cpp:3:7: note: 'foo& foo::operator=(const foo&)' is implicitly deleted because the default definition would be ill-formed:
class foo

prog.cpp:3:7: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]'

In file included from /usr/include/c++/5/memory:81:0,
from prog.cpp:1:

/usr/include/c++/5/bits/unique_ptr.h:357:19: note: declared here
unique_ptr& operator=(const unique_ptr&) = delete;

If I remove the destructor ,my code compiles fine.

Answer Source

Because that's what the standard says. When you start adding special member functions, you inhibit the automatic generation of some of the other ones. This is in the same category of rules as how writing a non-default constructor means a default one won't be automatically generated for you.

Add this:

foo& operator=(foo&&) = default;