派生类移动构造先移基类后,成员移动结果是否未指定?
你的理解不正确
首先明确:基类Animal的移动构造函数只会操作other对象中的基类子对象部分,完全不会触碰Dog类独有的breed成员。
你引用的标准条款里说的“被移动的对象处于有效但未指定的状态”,指的是other的基类子对象在被移动后的状态——而other作为Dog对象,它的breed成员在基类移动构造执行完毕后,仍然保持着移动前的原始状态。
所以当你执行breed(std::move(other.breed))时,本质是从一个未被基类移动操作影响过的std::string对象进行移动构造,最终得到的breed成员会正确获取原来other.breed的内容(符合std::string移动构造的语义:目标对象接管源对象的资源,源对象进入有效但未指定的状态)。
简单说:基类和派生类的成员是各自独立的,基类移动不会碰派生类的成员,你的代码逻辑是安全的。
[移动操作后,]被移动的对象应处于有效但未指定的状态。
内容的提问来源于stack exchange,提问作者qdii
相关产品推荐
相关产品推荐

