C++ Function operator=无法引用隐式声明的函数-它是已删除的函数

C++ Function operator=无法引用隐式声明的函数-它是已删除的函数,c++,C++,那么它工作得很好。我只想为每个向量元素制作一个现有对象的副本。为什么第一种方法会抛出错误 为什么第一种方法会抛出错误 错误消息说明: Function operator=无法引用隐式声明-它是一个已删除的函数 因此,您无法复制分配,因为复制分配操作符已被删除 然而,如果我说 std::vector<Object> vec(n); for (auto & member :vec) { member = anExistingObject;

那么它工作得很好。我只想为每个向量元素制作一个现有对象的副本。为什么第一种方法会抛出错误

为什么第一种方法会抛出错误

错误消息说明:

Function operator=无法引用隐式声明-它是一个已删除的函数

因此,您无法复制分配,因为复制分配操作符已被删除

然而,如果我说

    std::vector<Object> vec(n); 
    for (auto & member :vec)
    {
        member = anExistingObject;
    }
auto member = anExistingObject;
那么它工作得很好

因此,您的类是可复制可构造的。这不是现有对象的赋值


soem为什么有些东西不可复制分配

典型案例:

  • 类具有引用或常量成员
  • 类具有基类或不可复制分配的类的成员
  • 类已显式定义移动构造函数或移动赋值运算符
  • 赋值运算符被显式删除(不适用于这种情况,因为错误消息表明该运算符是隐式声明的)
对于不太典型的情况,请参阅技术规范

通过为类显式定义一个复制赋值操作符,可以使
对象
复制可赋值


另外,你可以更简单地构造如下向量:

auto member = anExistingObject;
std::vector vec(n,一个存在的对象);

此副本-构造向量的元素,不需要赋值。

因为您的代码使用复制赋值运算符,并且
auto member=anExistingObject
使用复制构造函数。如果不了解
Object
是如何定义的,我们无法告诉您更多信息。
std::fill(vec.begin(),vec.end(),一个现有对象)-如果这不起作用(而且可能不会),那是因为您的
对象
类出于任何原因隐式删除了
操作符=
,可能是因为其中的某些内容不可复制分配。我们需要查看
对象,特别是其中的所有成员。这是因为您的第二行正在构造一个对象,而不是分配它。请创建一个。请提供一个。特别是要回答这个问题,需要查看
对象的复制赋值和复制构造函数
std::vector<Object> vec(n, anExistingObject);