移动赋值运算符没有移动我的 shared_ptr

Move assignment operator is not moving my shared_ptr

我的移动赋值运算符有一些问题,也许我只是误解了发生了什么。我下面的 SignalHolder 对象旨在保存指向 Signal 对象的共享指针,并在 SignalHolder 被销毁后立即调用其 detach() 方法。由于销毁对象会自动导致信号中断,因此只有一个存在很重要。因此,我使用移动语义来确保只有一个存在。

总之,即使我写了一个移动赋值运算符,它似乎并没有移动我的shared_ptr。如果我在赋值方法的末尾添加断点,*thisc 都指向同一个对象。我虽然 std::move 应该将 shared_ptr 移动到 *this 并使用 nullptr 离开 c?我在这里做错了什么?

class SignalHolder
{
    std::shared_ptr<SignalCallbackBase> _target;
    inline static int idIdx = 0;

    int id;

public:
    SignalHolder(std::shared_ptr<SignalCallbackBase> target = nullptr) :
        _target(target)
    {
        id = idIdx++;
        qDebug() << "SignalHolder construct " << id;
    }

    SignalHolder(const SignalHolder&) = delete;
    SignalHolder(const SignalHolder&& c) :
        _target(std::move(c._target))
    {
        qDebug() << "SignalHolder move construct " << id;
    }

    ~SignalHolder()
    {
        qDebug() << "SignalHolder destruct " << id;
        detach();
    }

    SignalHolder& operator=(SignalHolder const&) = delete;
    SignalHolder& operator=(SignalHolder const&& c)
    {
        qDebug() << "SignalHolder assign move " << id;
        _target = std::move(c._target);

        //Break point here
        int j = 9;
    }

    void detach() {
        qDebug() << "SignalHolder detach " << id;
        if (_target)
            _target->detach();

        _target = nullptr;
    }
};


SignalHolder makeHolder()
{
    auto s = std::make_shared<SignalCallbackBase>();
    return SignalHolder(s);
}

int main()
{
    SignalHolder a;
    a = makeHolder();

}

参数c声明为const,不能移动。移动操作应该对要移动的对象进行修改。在 _target = std::move(c._target); 中,调用了复制赋值运算符,但不调用 std::shared_ptr 的移动赋值运算符。 (std::shared_ptr 的移动赋值运算符对非常量进行右值引用,不能绑定到 const 对象。)

您也应该删除 const 限定词。

SignalHolder& operator=(SignalHolder && c)
{
    qDebug() << "SignalHolder assign move " << id;
    _target = std::move(c._target);

    //Break point here
    int j = 9;
    return *this;
}

顺便说一句:您在 operator= 中丢失了 return 语句。