这是一个演示课。我不希望我的类被复制,所以我删除了复制构造函数。我希望vector.emplace_back 使用这个构造函数’MyClass(Type type)‘。但是这些代码不会编译。为什么?
class MyClass
{
public:
typedef enum
{
e1,
e2
} Type;
private:
Type _type;
MyClass(const MyClass& other) = delete; // no copy
public:
MyClass(): _type(e1) {};
MyClass(Type type): _type(type) { /* the constructor I wanted. */ };
};
std::vector<MyClass> list;
list.emplace_back(MyClass::e1);
list.emplace_back(MyClass::e2);
原文由 wqyfavor 发布,翻译遵循 CC BY-SA 4.0 许可协议
vector
需要复制构造函数,以便在需要增加存储空间时复制元素。您可以阅读 矢量 文档
一些日志记录可以帮助您了解正在发生的事情
对于此代码
输出是
所以你可以
emplace_back
确实使用所需的构造函数来创建元素并在需要增加存储空间时调用复制构造函数。您可以预先调用reserve
有足够的容量以避免调用复制构造函数。如果由于某种原因你真的不希望它是可复制构造的,你可以使用
std::list
而不是std::vector
因为list
它被实现为链表,不需要移动元素。http://coliru.stacked-crooked.com/a/16f93cfc6b2fc73c