无法使用boost object_pool构造具有移动构造函数的对象

时间:2014-05-04 23:37:28

标签: c++ visual-c++ boost pool

我正在尝试使用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构造函数?

由于

2 个答案:

答案 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;