gpt4 book ai didi

c++ - 如何为菱形继承实现移动构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:05 24 4
gpt4 key购买 nike

我有一个菱形的类层次结构,其中没有默认构造函数,也没有复制构造函数。我有两个构造函数,一个是“移动”构造函数,另一个是对对象采用左值引用:

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) // ???
};

除了不使用菱形层次之外,是否可以实现具体类的移动构造函数?

谢谢!

最佳答案

要求编译器提供实现有什么问题?

concrete(concrete&&) = default;

我也将 virt_1virt_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_1virt_2 基类的初始化器是无用的,因为它们只调用了 base 构造函数,并且因为它是一个虚拟基类,所以它们赢了当 concrete 调用它时不要这样做,但是由于您选择的构造函数,您不能默认构造它们并且需要用右值初始化它们,即使它们不会对它做任何事情.

关于c++ - 如何为菱形继承实现移动构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com