ynimous ynimous - 3 months ago 9
C++ Question

Why does a move constructor requires 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 {
public:
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

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)) {}