У меня есть следующий простой тестовый код.
#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
не идеально пересылать аргументы construct
: Это просто занимает const
ссылка на тип значения и передает его как инициализатор для размещения new
,
Это потому pool_allocator
еще не был обновлен для C ++ 11.