I wrote a simple program to play around with in-place creation of objects inside standard library containers. This is what I wrote:
#include <vector>
#include <iostream>
class AB
{
public:
explicit AB(int n);
AB(const AB& other) = delete;
AB(AB&& other);
AB& operator=(const AB& other) = delete;
AB& operator=(AB&& other) = default;
private:
int i;
};
AB::AB(int n): i( n )
{
std::cout << "Object created." << std::endl;
};
AB::AB(AB&& other): i( std::move(other.i) )
{
std::cout << "Object moved." << std::endl;
};
int main()
{
std::vector< AB > v;
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
};
I compiled it with g++ (version 4.8.2). After running the output, I got:
Object created.
Object created.
Object moved.
Object created.
Object moved.
Object moved.
But I expected something like this:
Object created.
Object created.
Object created.
I thought the whole point of emplacement was to get rid of the movement constructor calls. Are there any requirements in class AB that are not met?
Thanks for your help.
See Question&Answers more detail:os