File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
2836protected:
You can’t perform that action at this time.
0 commit comments