【问题标题】:Cant construct object with move constructor using boost object_pool无法使用 boost object_pool 使用移动构造函数构造对象
【发布时间】:2014-05-04 23:37:27
【问题描述】:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    不,当前版本的boost 不支持它。为了支持您需要的增强池,必须提供以下签名用于构建:

    template <typename T0> element_type * construct(T0 && a0) { ... }
    

    并且由于这将是一个模板化函数,其中左值和右值都可以绑定到参数,因此实现必须正确调度这两种类型的值的构造。

    您可以在boost/pool/detail/pool_construct.ipp 中找到可用的构造签名。

    【讨论】:

    • 谢谢。我查看了文件,但现在似乎没有解决方案。
    【解决方案2】:

    错误消息表明您正在尝试将函数转换为右值引用。

    MyObject obj(); 行声明了一个名为obj 的函数,对函数执行std::move 是无效的。

    我猜你的意思是MyObject obj;

    【讨论】:

    • Most vexing parse又来了!
    • 是的,我的意思是 MyObject obj,但这并不能解决问题。
    • @bcsanches 我看到您更新了代码,但您还需要发布新的错误消息(如果有)
    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2021-09-15
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多