如何在基础 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
确实是一个 lvalue
。 src
作为 rvalue
传递给您的构造函数,因为调用者打算这样解释它。
现在,在您的构造函数中,该变量实际上已命名,并且使用此名称会导致需要显式标记为 rvalue reference
的表达式才能被如此解释。否则,它只是一个左值。这就是为什么你必须再次 move
它被被调用者(这里,MyMovingBase::ctor
)解释为 rvalue
其内容被允许从原始对象中移出。
因此,弗朗索瓦的评论是正确的。使用
Subclass(Subclass &&src) : MyMovingBase<SubClass>(std::move(src))
成功了。
我有一个 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
确实是一个 lvalue
。 src
作为 rvalue
传递给您的构造函数,因为调用者打算这样解释它。
现在,在您的构造函数中,该变量实际上已命名,并且使用此名称会导致需要显式标记为 rvalue reference
的表达式才能被如此解释。否则,它只是一个左值。这就是为什么你必须再次 move
它被被调用者(这里,MyMovingBase::ctor
)解释为 rvalue
其内容被允许从原始对象中移出。
因此,弗朗索瓦的评论是正确的。使用
Subclass(Subclass &&src) : MyMovingBase<SubClass>(std::move(src))
成功了。