【发布时间】:2019-06-10 18:05:06
【问题描述】:
我有一个包含指向对象的指针的类和它的子类。子类“move”构造函数我想调用基类move构造函数,原因很明显。使用 MSVS 2017 编译器,这似乎不起作用。
template<class SubT>
class MyMovingBase {
typedef MyMovingBase<MtY> ThisT;
protected:
MyMovingBase(const ThisT &src) {
// update copy and or reference DO NOT Move
}
MyMovingBase(ThisT &&src) {
// move stuff from src to this, invalidate src
}
};
class Subclass
: public MyMovingBase<SubClass>
{
public:
Subclass(const Subclass &src) : MyMovingBase<SubClass>(src) {
// does what is expected, calls copy constructor.
}
Subclass(Subclass &&src) : MyMovingBase<SubClass>(src) {
// the above initializer calls copy constructor and NOT
// the move constructor for MyMovingBase !!!!!!
}
};
我如何让它做我想要的??
当然我希望它也能在 gcc 和 clang 中工作。
【问题讨论】:
-
MyMovingBase<SubClass>(std::move(src))请注意,src是一个右值引用,但它本身就是一个左值,因此不会单独绑定到另一个右值引用。 -
保存自己并使用零规则
class Subclass : public MyMovingBase<SubClass> {}将自动为您调用基类构造函数,因为编译器生成默认值“做正确的事” -
由于
MyMovingBase和Subclass是你自己的类,所以关于移动后状态的保证完全在你手中。我看不出它有什么不好的地方。 -
糟糕的是语法而不是灵活性:)
-
@peterk 如果有人将您的某个问题标记为重复,您可以自己将其关闭为重复。 (我自己在另一个网站上发现了这个。)
标签: c++ move-semantics