我写了一个简单的程序来测试在标准库容器内创建对象的in-place方法。这是我的代码:
#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);
};
我使用g ++(版本4.8.2)进行编译。运行输出后,我得到了:
Object created.
Object created.
Object moved.
Object created.
Object moved.
Object moved.
但我预料到会发生这样的事情:
Object created.
Object created.
Object created.
我认为放置的整个目的是为了摆脱移动构造函数调用。AB类中是否有未满足的任何要求?
感谢您的帮助。
noexcept
,否则在重新分配元素时,vector
将倾向于使用非破坏性的复制构造函数。因此,请确保标记移动构造函数为noexcept
:) - Matthieu M.