如何在基类中调用 "move" '&&' 构造函数?在C++

How does one call a "move" '&&' constructor in a base class? in C++

本文关键字:构造函数 C++ 基类 调用 move      更新时间:2023-10-16

我有一个包含指向对象的指针的类及其子类。 子类"移动"构造函数 出于显而易见的原因,我想称基类为移动构造函数。 对于 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 中也能工作。

一般来说,将某个变量标记为rvalue reference &&并不意味着它在进一步传递src时保持此状态。我的意思是,毕竟,变量在构造函数的上下文中有一个名称,因此显然可以用作lvalue。事实上,表达src确实是一个lvaluesrc作为rvalue传递给构造函数,因为调用方打算将其解释为这样。

现在,在您的构造函数中,变量实际上是命名的,使用此名称会导致一个表达式需要显式标记为rvalue reference才能解释为这样。否则,它只是一个左值。这就是为什么您必须再次move它才能被调用方(此处,MyMovingBase::ctor)解释为允许其内容移出原始对象的rvalue

因此,弗朗索瓦的评论是正确的。用

Subclass(Subclass &&src) : MyMovingBase<SubClass>(std::move(src))

能解决问题。