ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 使用boost :: pool_allocator时不调用Move构造函数

2019-08-30 08:06:16  阅读:163  来源: 互联网

标签:c c11 boost move-semantics boost-pool


我有以下简单的测试代码.

#include <stack>
#include <iostream>
#include "boost/pool/pool_alloc.hpp"

struct Frame
{
    uint32_t i{};

    Frame(uint32_t _i) : i(_i) {}

    Frame(const Frame& f)
    {
        std::cout << "Copy constructor" << std::endl;
        i = f.i;
    }

    Frame(Frame&& f)
    {
        std::cout << "Move constructor" << std::endl;
        std::swap(i, f.i);
    }
};

int main(int argc, char* argv[])
{
    {
        std::stack<Frame, std::deque<Frame>> stack;

        Frame f(0);
        stack.push(std::move(f)); // Move constructor
        stack.push(Frame(1)); // Move constructor
    }

    {
        std::stack<Frame, std::deque<Frame, boost::pool_allocator<Frame>>> stack;

        Frame f(0);
        stack.push(std::move(f)); // Copy constructor
        stack.push(Frame(1)); // Copy constructor
    }


    return 0;
}

当我使用Clang或GCC编译此代码时,它给出了以下输出:

Move constructor
Move constructor
Copy constructor
Copy constructor

为什么使用boost :: pool_allocator会阻止编译器使用移动构造函数?
我错过了什么吗?

解决方法:

pool_allocator不能完美地转发构造的参数:它只是对值类型进行const引用,并将其作为初始化器传递给new.

这是因为尚未为C 11更新pool_allocator.

标签:c,c11,boost,move-semantics,boost-pool
来源: https://codeday.me/bug/20190830/1766683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有