Skip to content

Commit 220c087

Browse files
committed
CallbackCaller: fixed the "use after move-from" when there is more than 1 subscriber
1 parent ae236ea commit 220c087

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

utility/callback_caller.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,16 @@ class CallbackCaller {
2121
template <typename MethodPointer, typename ...Args>
2222
void invokeCallback(MethodPointer methodPtr, Args... args) const
2323
{
24-
for (Interface* subscriber: _subscribers)
25-
(subscriber->*methodPtr)(std::forward<Args>(args)...);
24+
// args are already by-value copies, not forwarding references, so std::forward would move out of them. Only the
25+
// last subscriber can safely receive the moved value - every earlier one still needs args intact for the next call.
26+
const size_t nSubscribers = _subscribers.size();
27+
if (nSubscribers == 0)
28+
return;
29+
30+
for (size_t i = 0; i < nSubscribers - 1; ++i)
31+
(_subscribers[i]->*methodPtr)(args...);
32+
33+
(_subscribers[nSubscribers - 1]->*methodPtr)(std::forward<Args>(args)...);
2634
}
2735

2836
protected:

0 commit comments

Comments
 (0)