ynimous ynimous - 1 year ago 86
C++ Question

Why does a move constructor require a default constructor for its members?

I was trying to implement a move constructor for a class without a copy constructor. I got an error that the default constructor for a member of the class was missing.

Here's a trivial example to illustrate this:

struct A {
A() = delete;
A(A const&) = delete;
A(A &&a) {}

struct B {
A a;
B() = delete;
B(B const&) = delete;
B(B &&b) {}

Trying to compile this, I get:

move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
B(B &&b) {}
move_without_default.cc:6:2: note: declared here
A() = delete;

Why is this an error? Any way around it?

Answer Source

Use the constructor's initializer list to initialize the A member. As written, the move constructor uses, as the compiler says, the default constructor for A.

B(B&& b) : a(std::move(b.a)) {}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download