提升 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);
使用 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);