Boost 1.48.0 upgrade_to_unique_lock on Linux: has something changed from 1.47 or am I something wrong?

I have small cpp and h source files with some class. It uses shared mutexes and shared locks . It compiles to windows without errors with an increase of 1.48.0. It is also compiled on linux (with a boost of 1.47 to). But now, having this code:

boost::shared_mutex mut_; //... boost::upgrade_lock<boost::shared_mutex> lock(mut_); boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock); 

leads to strange errors:

 ==== Building cf-fs (debug) ==== Creating bin/obj/Debug/cf-fs fs_concurrent_queued_map.cpp fs_map.cpp In file included from ../../src/cf-util/http_utils_inl.h:1, from ../../src/cf-util/http_utils.h:104, from ../../src/cf-fs/fs_map.h:13, from ../../src/cf-fs/fs_map.cpp:1: ../../src/cf-util/http_utils.h:105:8: warning: extra tokens at end of #endif directive In file included from ../../src/cf-fs/fs_map.h:13, from ../../src/cf-fs/fs_map.cpp:1: ../../src/cf-util/http_utils.h:105:8: warning: extra tokens at end of #endif directive In file included from ../../../boost_libraries/install-dir/include/boost/thread/pthread/mutex.hpp:12, from ../../../boost_libraries/install-dir/include/boost/thread/mutex.hpp:16, from ../../../boost_libraries/install-dir/include/boost/thread/pthread/thread_data.hpp:12, from ../../../boost_libraries/install-dir/include/boost/thread/thread.hpp:17, from ../../../boost_libraries/install-dir/include/boost/thread.hpp:13, from ../../src/cf-fs/fs_map.h:10, from ../../src/cf-fs/fs_map.cpp:1: ../../../boost_libraries/install-dir/include/boost/thread/locks.hpp: In constructor 'boost::upgrade_to_unique_lock<Mutex>::upgrade_to_unique_lock(boost::upgrade_lock<Mutex>&) [with Mutex = boost::shared_mutex]': ../../src/cf-fs/fs_map.cpp:33: instantiated from here ../../../boost_libraries/install-dir/include/boost/thread/locks.hpp:926: error: call of overloaded 'move(boost::upgrade_lock<boost::shared_mutex>&)' is ambiguous ../../../boost_libraries/install-dir/include/boost/thread/detail/move.hpp:44: note: candidates are: typename boost::enable_if<boost::is_convertible<T&, boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T> >::type boost::move(T&) [with T = boost::upgrade_lock<boost::shared_mutex>] ../../../boost_libraries/install-dir/include/boost/move/move.hpp:294: note: typename boost::move_detail::disable_if<boost::has_move_emulation_enabled<T>, T&>::type boost::move(T&) [with T = boost::upgrade_lock<boost::shared_mutex>] ../../../boost_libraries/install-dir/include/boost/thread/locks.hpp: In destructor 'boost::upgrade_to_unique_lock<Mutex>::~upgrade_to_unique_lock() [with Mutex = boost::shared_mutex]': ../../src/cf-fs/fs_map.cpp:33: instantiated from here ../../../boost_libraries/install-dir/include/boost/thread/locks.hpp:932: error: call of overloaded 'move(boost::unique_lock<boost::shared_mutex>&)' is ambiguous ../../../boost_libraries/install-dir/include/boost/thread/detail/move.hpp:44: note: candidates are: typename boost::enable_if<boost::is_convertible<T&, boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T> >::type boost::move(T&) [with T = boost::unique_lock<boost::shared_mutex>] ../../../boost_libraries/install-dir/include/boost/move/move.hpp:294: note: typename boost::move_detail::disable_if<boost::has_move_emulation_enabled<T>, T&>::type boost::move(T&) [with T = boost::unique_lock<boost::shared_mutex>] make[1]: *** [bin/obj/Debug/cf-fs/fs_map.o]  1 make: *** [cf-fs]  2 

Is there something wrong with my code that doesn't compile and how to fix it or work around it?

+4
source share
1 answer
 --- a/locks.hpp 2011-12-05 12:26:11.650309054 +0400 +++ b/locks.hpp 2011-12-05 12:27:25.905311415 +0400 @@ -923,13 +923,13 @@ upgrade_to_unique_lock& operator=(upgrade_to_unique_lock&); public: explicit upgrade_to_unique_lock(upgrade_lock<Mutex>& m_): - source(&m_),exclusive(move(*source)) + source(&m_),exclusive(move(detail::thread_move_t<upgrade_lock<Mutex> >(*source))) {} ~upgrade_to_unique_lock() { if(source) { - *source=move(exclusive); + *source=move(detail::thread_move_t<unique_lock<Mutex> >(exclusive)); } } 
+2
source

Source: https://habr.com/ru/post/1382923/


All Articles