说服构造函数将对象移动到父构造函数
Convince a constructor to move an object a parent's constructor
我一直在尝试在不复制对象的情况下将对象转发给父对象。我似乎无法做到这一点,也不知道为什么。
这是我想做的事情的一个例子。但是,它不会编译。
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)。
为什么它不让我这样做?这是语言中的错误还是怪癖?我怎样才能以正确的方式编写它而不必在对象上实现复制构造函数(对于我实际想要这样做的情况来说这将是非常昂贵的)?
您不能移出 const
个对象。应该是Child(Initialisee i)
,不是Child(const Initialisee i)
.
我自己遇到过something similar
移动操作应该对要移动的对象进行修改;但是 i
被标记为 const
并且无法移动。特别是,const Initialisee
不能绑定到Initialisee&&
,那么它就不能传递给Initialisee
的移动构造函数。
如果您打算执行移动操作,最好将其声明为右值引用。例如
class Child: public Parent {
public:
Child(Initialisee&& i): Parent(std::move(i)) { }
};
我一直在尝试在不复制对象的情况下将对象转发给父对象。我似乎无法做到这一点,也不知道为什么。
这是我想做的事情的一个例子。但是,它不会编译。
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)。
为什么它不让我这样做?这是语言中的错误还是怪癖?我怎样才能以正确的方式编写它而不必在对象上实现复制构造函数(对于我实际想要这样做的情况来说这将是非常昂贵的)?
您不能移出 const
个对象。应该是Child(Initialisee i)
,不是Child(const Initialisee i)
.
我自己遇到过something similar
移动操作应该对要移动的对象进行修改;但是 i
被标记为 const
并且无法移动。特别是,const Initialisee
不能绑定到Initialisee&&
,那么它就不能传递给Initialisee
的移动构造函数。
如果您打算执行移动操作,最好将其声明为右值引用。例如
class Child: public Parent {
public:
Child(Initialisee&& i): Parent(std::move(i)) { }
};