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

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

我有一个 class 包含指向对象的指针和它的子 class。 subclass "move" 构造函数我想调用 base class 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 中工作。

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

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

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

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

成功了。