c++ - 不能引用隐式声明的函数 operator= - 它是一个已删除的函数
问题描述
std::vector<Object> vec(n);
for (auto & member :vec)
{
member = anExistingObject;
}
此代码在标题中引发错误。但是,如果我说
auto member = anExistingObject;
然后它工作正常。我只想anExistingObject
为每个向量元素制作一个副本。为什么第一种方式会抛出错误?
解决方案
为什么第一种方式会抛出错误?
错误消息说明:
不能引用隐式声明的函数 operator= -它是一个已删除的函数
因此,您不能复制分配,因为复制分配运算符已被删除。
但是,如果我说
auto member = anExistingObject;
然后它工作正常。
因此,您的课程是可复制可构造的。这不是现有对象的分配。
为什么某些东西不可复制分配的一些原因是什么?
典型案例:
- 类具有引用或 const 成员。
- 类具有不可复制分配的基类或类成员。
- 类已显式定义移动构造函数或移动赋值运算符
- 赋值运算符被显式删除(不适用于这种情况,因为错误消息表明运算符是隐式声明的)。
对于不太典型的情况,请参阅规范。
您可以Object
通过为类显式定义复制分配运算符来使复制可分配。
PS你可以更简单地构造这样的向量:
std::vector<Object> vec(n, anExistingObject);
此复制构造向量的元素,并且不需要赋值。