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

时间:2014-12-24 13:56:22

标签: c++ c++11 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会阻止编译器使用移动构造函数?
我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

pool_allocator并不能完美地将论据转发给construct:它只需要const对值类型的引用,然后将其作为展示位置new的初始化程序传递。

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