https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69060

Sławomir <slawomir.karol.domagala at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |slawomir.karol.domagala@gma
                   |                            |il.com

--- Comment #1 from Sławomir <slawomir.karol.domagala at gmail dot com> ---
The same with version 4.9.4 20150813 (prerelease)

Error:
  CXX     diag/bin/fsmf_test/collector_handler.o
src/log_collecting/collector_handler.cpp: In member function ‘void
diag::collector_handler::add_file_to_dl_list(const string&, bool)’:
src/log_collecting/collector_handler.cpp:274:47: error: cannot bind ‘bool’
lvalue to ‘bool&&’
  observers_list->notify_observers(uri, is_last);
                                               ^
In file included from ../diag/src/log_collecting/diag_object.h:8:0,
                 from src/log_collecting/collector_handler.h:11,
                 from src/log_collecting/collector_handler.cpp:13:
../diag/src/log_collecting/observers_container.h:52:15: note: initializing
argument 2 of ‘void
diag::observers_container<callback_args_types>::notify_observers(callback_args_types&&
...) [with callback_args_types = {boost::optional<std::basic_string<char,
std::char_traits<char>, std::allocator<char> > >, bool}]’
  virtual void notify_observers(callback_args_types&&... args) {


Code:
template <typename... callback_args_types>
class observers_container
{
public:
        typedef std::function<void(callback_args_types...)> callback_type;

        observers_container() = default;
        virtual ~observers_container() = default;

        /*!
         * Copy constructor
         */
        observers_container(const observers_container& o_container) {
                observers_list = o_container.observers_list;
        }

        /*!
         * Adds observer
         */
        void add(callback_type obs) {
                std::lock_guard<std::mutex> lock(list_mtx);
                observers_list.push_back(obs);
        }

        /*!
         * Removes observer
         */
        void remove(const callback_type& obs_to_unregister) {
                std::lock_guard<std::mutex> lock(list_mtx);
                observers_list.remove(obs_to_unregister);
        }

        /*!
         * Notifies observers
         */
        virtual void notify_observers(callback_args_types&&... args) {
                std::lock_guard<std::mutex> lock(list_mtx);
                for(auto observer: observers_list) {
                        observer(std::forward<callback_args_types>(args)...);
                }
        }

private:
        std::list<diag_object_observer_handle> observers_list;
        mutable std::mutex list_mtx;
};

Reply via email to