【发布时间】:2014-07-19 20:24:22
【问题描述】:
我编写了一个简单的程序来在标准库容器中就地创建对象。这是我写的:
#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类有什么要求没有满足吗?
感谢您的帮助。
【问题讨论】:
-
+1 很高兴看到一个清晰的问题,包含所有必要的信息和一个独立的工作代码示例。不幸的是,这几天是个例外。
-
注意:如果你不删除复制构造函数,那么你的对象就是copied。这是因为除非移动构造函数被标记为
noexcept,否则vector在重新分配元素时将更喜欢使用非破坏性复制构造函数。因此... 将移动构造函数标记为noexcept:)