我有一个菱形的类层次结构,其中没有默认构造函数,也没有复制构造函数。我所拥有的两个构造函数是一个“移动”,另一个是对象的左值引用:
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) // ???
};
除了不使用菱形层次结构外,是否可以为具体类实现移动构造函数?
谢谢!
答案 0 :(得分:9)
要求编译器提供实现有什么问题?
concrete(concrete&&) = default;
我也将virt_1
和virt_2
移动构造函数定义为默认值。
如果您真的想要,可以写出来:
concrete(concrete&& rhs)
: base(std::move(rhs)), virt_1(std::move(rhs)), virt_2(std::move(rhs))
{ }
或者如果你真的喜欢打字:
concrete(concrete&& rhs)
: base(static_cast<base&&>(rhs)),
virt_1(static_cast<virt_1&&>(rhs)),
virt_2(static_cast<virt_2&&>(rhs))
{ }
virt_1
和virt_2
基础的初始化程序是无用的,因为它们只调用base
构造函数,因为它是虚拟基础,所以{{1}时它们不会这样做已经调用了它,但由于你选择了构造函数,你不能默认构造它们,并且需要用rvalue初始化它们,即使它们对它没有任何作用。
答案 1 :(得分:1)
不确定。层次结构中某处具有virtual
基础的任何构造函数都负责初始化该基础。基本上,层次结构中virtual
基础之下的任何类都继承了初始化基础的权限。
在这种情况下,默认的移动构造函数应该做正确的事情。我建议还指定concrete : private virtual base
来澄清正在发生的事情。
Here是一个有效的演示。