I'm having some trouble with my move assignment operator, and maybe I'm just misunderstanding what's going on. My SignalHolder object below is meant to hold a shared pointer to a Signal object and call its detach() method as soon as the SignalHolder is destroyed. Since destroying the object automatically causes the signal to be broken, it's important that only one exists. Hence I'm using move semantics to ensure only one exists.
Anyhow, even though I've written a move assignment operator, it doesn't seem to be moving my shared_ptr. If I add break point to the end of the assignment method, both *this and c point to the same object. I though std::move was supposed to move the shared_ptr to *this and leave c with a nullptr? What am I doing wrong here?
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();
}
Aucun commentaire:
Enregistrer un commentaire