我正在尝试使用boost object_pool创建一个对象,但是尝试使用所需对象的移动构造函数,但在Visual 2013上,我总是得到:
错误C2280:' MyObject :: MyObject(const MyObject&)' :尝试引用已删除的函数
发生错误是因为boost pool构造方法总是假设一个const参数。
示例代码:
#include <boost/pool/object_pool.hpp>
class MyObject
{
public:
MyObject():
m_iData(0)
{
}
MyObject(MyObject &&other):
m_iData(std::move(other.m_iData))
{
other.m_iData = 0;
}
MyObject(const MyObject &rhs) = delete;
MyObject &operator=(const MyObject &rhs) = delete;
private:
int m_iData;
};
int main(int, char**)
{
boost::object_pool<MyObject> pool;
MyObject obj;
MyObject *pObj = pool.construct(std::move(obj));
}
有没有办法使用boost :: object_pool调用move构造函数?
由于
答案 0 :(得分:3)
目前版本的boost不支持它。为了支持您的需求,增强池必须为构造提供以下签名:
template <typename T0> element_type * construct(T0 && a0) { ... }
因为这将是一个模板化函数,其中左值和右值都可以绑定到参数,实现必须正确地为两种类型的值分配构造。
您可以在boost/pool/detail/pool_construct.ipp
中找到可用的施工签名。
答案 1 :(得分:1)
错误消息表明您正在尝试将函数转换为rvalue-reference。
行MyObject obj();
声明了一个名为obj
的函数,对函数执行std::move
无效。
我猜你的意思是MyObject obj;