【问题标题】:Move semantics, why isnt the move constructor called?移动语义,为什么不调用移动构造函数?
【发布时间】:2013-11-07 19:51:16
【问题描述】:

这是我得到的:

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 的 move 和 move 赋值构造函数被正确调用)但 B 的所有者没有改变(虽然我们交换后我希望它更改为 a2)。

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

【问题讨论】:

    标签: c++ move-semantics


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2017-07-03
        • 2014-01-24
        相关资源
        最近更新 更多