提升 shared_memory_object 已删除函数的使用

boost shared_memory_object use of deleted function

使用 class operator=

中删除的函数

旧版本适用于旧编译器,但不适用于新版本 我需要这个 "operator=" 容器操作重载。

#include <boost/interprocess/ipc/message_queue.hpp>
#include <iostream>
using namespace boost::interprocess;
class X {
    public:
    size_t m_len;
    shared_memory_object m_shm;
    const char* m_ptr;
    X():
        m_len(0),
        m_shm(shared_memory_object()),
        m_ptr(nullptr){}
    X(size_t t, const char* n):
       m_len(t),
       m_shm(shared_memory_object()),
       m_ptr(nullptr){
       shared_memory_object::remove(n);
       m_shm = shared_memory_object(open_or_create,n, read_write);
       m_shm.truncate (m_len);
       mapped_region region(m_shm, read_write);
       m_ptr = static_cast<char*>(region.get_address());
   }
   X(const X&&  x){
      m_len   = x.m_len;
      m_shm   = x.m_shm; //error use deleted function
      m_ptr   = x.m_ptr;
   }
   virtual ~X(){}    
   X& operator = (const X&& a) {
      if(&a == this)  return *this;
      m_len   = a.m_len;
      m_ptr   = a.m_ptr;
      m_shm   = a.m_shm;  //error use deleted function
      return (*this);
  }
  const char* get_name(){
     return m_shm.get_name();
  }
};
int main ()
{
    X a = X(22, "test");
    X b = a; //Error
   return 0;
};

上面的class会用在std::vector中,需要operator=。 boost shared_memory_object 有成员:

shared_memory_object(shared_memory_object &&);
shared_memory_object& operator=(shared_memory_object &&);

移动操作只能对非常量对象起作用。为什么?因为它从源实例中窃取资源,所以它必须是非常量才能被修改。所以你的移动操作应该采用 non-const objects:

now                                should be
---------------------------------------------------------- 
X(const X&&  x)                ==> X(X&& x)
X& operator = (const X&& a) {  ==> X& operator = (X&& a) {

命名变量被视为左值,这意味着调用了复制操作。需要使用std::move将source转换为R值引用,然后才能调用move操作:

      m_shm   = std::move(x.m_shm); // in move ctor 
      m_shm   = std::move(a.m_shm); // in move assignment operator

最后调用 move ctor:

    X b = std::move(a);