如何解决移动赋值运算符没有移动我的 shared_ptr
我的移动赋值运算符有问题,也许我只是误解了发生了什么。我下面的 SignalHolder
对象用于保存指向 Signal
对象的共享指针,并在 SignalHolder 销毁后立即调用其 detach()
方法。由于销毁对象会自动导致信号中断,因此只有一个存在是很重要的。因此我使用移动语义来确保只有一个存在。
无论如何,即使我写了一个移动赋值运算符,它似乎并没有移动我的 shared_ptr。如果我在赋值方法的末尾添加断点,*this
和 c
都指向同一个对象。我虽然 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 语句。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。