I have a diamond-shaped hierarchy of classes, where there is no default constructor, nor copy constructors. The two constructors I have are a "move" one and another that takes a lvalue reference to an object:
struct base {
base(base&&) = default;
base(member_type&& m): member_(std::move(m)) {}
member_type member_;
};
struct virt_1: virtual base {
virt_1(virt_1&& rhs): base(std::move(rhs)) {}
virt_1(member_type&& m): base(std::move(m)) {}
};
struct virt_2: virtual base {
virt_2(virt_2&& rhs): base(std::move(rhs)) {}
virt_2(member_type&& m): base(std::move(m)) {}
};
struct concrete: virt_1, virt_2 {
concrete(concrete&& rhs) // ???
};
Besides not using a diamond-shaped hierarchy, is it possible to implement the move constructor for the concrete class?
Thanks!
What's wrong with asking the compiler to provide the implementation?
concrete(concrete&&) = default;
I'd define the virt_1 and virt_2 move constructors as defaulted too.
You could write it out if you really wanted to:
concrete(concrete&& rhs)
: base(std::move(rhs)), virt_1(std::move(rhs)), virt_2(std::move(rhs))
{ }
Or if you really like typing:
concrete(concrete&& rhs)
: base(static_cast<base&&>(rhs)),
virt_1(static_cast<virt_1&&>(rhs)),
virt_2(static_cast<virt_2&&>(rhs))
{ }
The initializers for the virt_1 and virt_2 bases are useless, because they only call the base constructor and as it's a virtual base they won't do that when concrete has called it, but due to your choices of constructors you can't default-construct them and are required to initialize them with an rvalue even though they'll do nothing with it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With