2012-09-17 39 views
0

以下編譯下VS2010(Express),但不是gcc(4.6.2在這裏)。boost無法移動scoped_lock與海灣合作委員會

Lockable.h:

#include <boost/thread/mutex.hpp> 
#include <boost/interprocess/sync/scoped_lock.hpp> 

template<typename T> 
class LockedProxy : boost::noncopyable 
{ 
public: 
    inline LockedProxy(boost::mutex & m, T * obj) 
     :lock(m), 
     t(obj) 
    {} 
    inline LockedProxy(const LockedProxy && other) 
     :lock(std::move(other.lock)), 
     t(std::move(other.t)) 
    {} 

    inline  T * operator->()  { return t; } 
    inline const T * operator->() const { return t; } 

    inline const T & operator*() const { return *t; } 
    inline  T & operator*()  { return *t; } 

private: 
    boost::interprocess::scoped_lock<boost::mutex> lock; 
    T * t; 
}; 


template<typename T> 
class Lockable 
{ 
public: 

    // Convenience typefed for subclasses to use 
    typedef T LockableObjectType; 

    inline Lockable(const T & t) 
     :lockableObject(t) 
    {} 

    inline LockedProxy<LockableObjectType> GetLockedProxy() { 
     return LockedProxy<LockableObjectType>(mutex, &lockableObject); 
    } 

protected: 
    LockableObjectType lockableObject; 
    boost::mutex mutex; 
}; 

main.cpp中:

#include <iostream> 
#include <string.h> 
#include "Lockable.h"  

void f(Lockable<std::string> & str) 
{ 
    auto proxy = str.GetLockedProxy(); 

    *proxy = "aa"; 
    proxy->append("bb"); 

    std::cout << "str = " << *proxy << std::endl; 
} 

void g(Lockable<int> & i) 
{ 
    { // reduce lock's lifespan 
     auto proxy = i.GetLockedProxy(); 
     *proxy = 321; 
    } 

    // relock, lock lives for the statement 
    std::cout << "i = " << *i.GetLockedProxy() << std::endl; 
} 

int main() 
{ 
    Lockable<std::string> str("abc"); 
    //Can't use str here, it is not locked 
    f(str); 

    Lockable<int> i(123); 
    g(i); 

    return 0; 
} 

的錯誤:

In file included from main.cpp:3:0: 
C:/Users/DrGibbs/Documents/code/boost_1_46_0/boost/interprocess/sync/scoped_lock.hpp: In constructor 'LockedProxy<T>::LockedProxy(const LockedProxy<T>&&) [with T = std::basic_string<char>, LockedProxy<T> = LockedProxy<std::basic_string<char> >]':main.cpp:7:37: instantiated from here 
C:/Users/DrGibbs/Documents/code/boost_1_46_0/boost/interprocess/sync/scoped_lock.hpp:56:4: error: 'boost::interprocess::scoped_lock<Mutex>::scoped_lock(const boost::interprocess::scoped_lock<Mutex>&)[with Mutex = boost::mutex, boost::interprocess::scoped_lock<Mutex> = boost::interprocess::scoped_lock<boost::mutex>]' is privateLockable.h:14:29: error: within this context 
C:/Users/DrGibbs/Documents/code/boost_1_46_0/boost/interprocess/sync/scoped_lock.hpp: In constructor 'LockedProxy<T>::LockedProxy(const LockedProxy<T>&&) [with T = int, LockedProxy<T> = LockedProxy<int>]': 
main.cpp:18:36: instantiated from here 
C:/Users/DrGibbs/Documents/code/boost_1_46_0/boost/interprocess/sync/scoped_lock.hpp:56:4: error: 'boost::interprocess::scoped_lock<Mutex>::scoped_lock(const boost::interprocess::scoped_lock<Mutex>&)[with Mutex = boost::mutex, boost::interprocess::scoped_lock<Mutex> = boost::interprocess::scoped_lock<boost::mutex>]' is private 
Lockable.h:14:29: error: within this context 

嘛,據我ü理解,在LockedProxy的移動構造函數中,scoped_lock不會移動,而是複製構建,這真的不應該起作用。 std::move不應該保證它的移動建設嗎?我錯過了什麼?

回答

2

您的移動構造函數聲明其參數const

inline LockedProxy(const LockedProxy && other) 

應申報非const:

inline LockedProxy(LockedProxy && other) 

std::move(other.lock)正在other.lock爲const引用,所以返回一個const右值參考const boost::interprocess::scoped_lock<boost::mutex> &&,不能傳遞給移動構造函數boost::interprocess::scoped_lock<boost::mutex>

另請參閱C++0x const RValue reference as function parameter,它解釋了const rvalue引用幾乎完全無用。

+0

AAAH!那是我的la ... ...... – Gabriel

相關問題