使用移动语义将基类实例推送到子类实例

P45*_*ent 5 c++ c++11

假设我有一个实例化的Base b.Foo是一个儿童班Base.

我想要做的是拥有一个构造函数 Foo

class Foo : public Base
{
    Foo(Base b, T otherArg) : Base(b)
    {
        /*ToDo - do something with otherArg*/
    }
}
Run Code Online (Sandbox Code Playgroud)

'b'实例移动Foo正在构造的实例.如果构造Foo失败(例如在我的/*ToDo step*/),则b不应移动.

我可以在C++ 11中这样做吗?(我付不起深刻的副本).构造函数原型需要Foo(Base&& b, T otherArg)吗?

qua*_*dev 2

是的你可以 :

  • 为类声明一个移动构造函数,Base以便接受右值
  • 移动基本参数std::move

例子:

#include <iostream>
#include <utility>

class Base
{
    public:

    Base() {}

    Base(Base&& b) { std::cout << "Move ctr"; }  
};

class Foo : public Base
{
    public:

    Foo(Base&& b, double otherArg) : Base(std::move(b))
    {
       // ...
    }
};

int main()
{
    Foo(Base(), 2.0);
}
Run Code Online (Sandbox Code Playgroud)

或者

int main()
{
    Base b;
    Foo(std::move(b), 2.0);
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 至于发生异常时的回滚,您仍然可以保存bin的状态Base(Base&& b)(当然,在对它进行任何操作之前),并在构造函数rollback_move中发生异常时通过成员函数恢复它Foo

现场演示

  • 这忽略了问题的“‘Foo’的构造失败(例如在我的‘/*ToDo步骤*/’中)”... (2认同)