【问题标题】:Convince a constructor to move an object a parent's constructor说服构造函数将对象移动为父构造函数
【发布时间】:2021-09-15 11:34:47
【问题描述】:

我一直试图在不复制对象的情况下将对象转发给父级。我似乎无法做到这一点,也不知道为什么。

这是我想做的事情的一个例子。但是,它无法编译。

class Initialisee {
    public:
        Initialisee() = default;
        Initialisee(const Initialisee&) = delete;
        Initialisee(Initialisee&&) = default;
};

class Parent {
    public:
        Parent(const Initialisee i) { }
};

class Child: public Parent {
    public:
        Child(const Initialisee i): Parent(std::move(i)) { }
};

这不会编译,因为尽管有std::move(),孩子仍在尝试复制构造对象以将其传递给父构造函数。我正在使用启用了最新语言功能的 MSVC 2019 (16.10.3)。

为什么不让我这样做?这是语言中的错误还是怪癖?我怎样才能以正确的方式编写它而不必在对象上实现复制构造函数(这对于我真正想要这样做的情况来说非常昂贵)?

【问题讨论】:

    标签: c++ inheritance constructor c++20 perfect-forwarding


    【解决方案1】:

    移动操作应该是对要移动的对象进行修改;但是i 被标记为const 并且不能被移动。特别是const Initialisee不能绑定到Initialisee&&,那么就不能传递给Initialisee的移动构造函数。

    如果您的意图是执行移动操作,最好将其声明为右值引用。例如

    class Child: public Parent {
        public:
            Child(Initialisee&& i): Parent(std::move(i)) { }
    };
    

    【讨论】:

      【解决方案2】:

      您不能移出const 对象。应该是Child(Initialisee i),而不是Child(const Initialisee i)

      我自己也遇到过something similar

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 2019-10-08
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 2022-12-18
        • 2013-10-20
        • 2021-10-22
        • 1970-01-01
        相关资源
        最近更新 更多