移动语义,为什么不调用移动构造函数?

时间:2013-11-07 19:51:16

标签: c++ move-semantics

这就是我所拥有的:

class A {
    class B{
        A* owner;
        B(A* owner){
            this->owner = owner;
        }
        B(B&& second)
            : owner(std::move(second.owner));
        {}

        B& operator=(B&& second){
            this->owner = second.owner;
        }
    };

    B* object;
    int a;
    string b;

    A(int a, string b){
        this->a = a;
        this->b = b;
        object = nullptr;
    }

    void create_B(){
        if(object == nullptr)
            object = new B(this);
    }

    A& operator=(A&& second){
        this->a = second.a;
        this->b = second.b;
        this->object = std::move(second.object);
        second.object = nullptr;
        return *this;
    }

    A(A&& second)
        : a(second.a)
        , b(second.b)
        , object(std::move(second.object)){
        second.object = nullptr;
    }
};

现在困扰我的是,当我做这样的事情时:

A a1(2, "aaa"), a2(3, "bbb");
a1.create_B();
swap(a1, a2);

一切都正确地改变它(A的移动和移动赋值构造函数被正确调用)但B的所有者不会改变(我希望它在我们交换后改为a2)。

为什么不在这里调用B的移动构造函数/移动赋值构造函数? 提前谢谢!

2 个答案:

答案 0 :(得分:0)

因为字段object被移动(复制)为指针。

答案 1 :(得分:0)

B的移动构造函数未被调用,因为您正在移动B *(指向B的指针),而不是B.尝试将对象定义为B的实例。