首页 > 解决方案 > 不能引用隐式声明的函数 operator= - 它是一个已删除的函数

问题描述

    std::vector<Object> vec(n); 
    for (auto & member :vec)
    {
        member = anExistingObject;
    }

此代码在标题中引发错误。但是,如果我说

auto member = anExistingObject;

然后它工作正常。我只想anExistingObject为每个向量元素制作一个副本。为什么第一种方式会抛出错误?

标签: c++

解决方案


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

错误消息说明:

不能引用隐式声明的函数 operator= -它是一个已删除的函数

因此,您不能复制分配,因为复制分配运算符已被删除。

但是,如果我说

auto member = anExistingObject;

然后它工作正常。

因此,您的课程是可复制可构造的。这不是现有对象的分配。


为什么某些东西不可复制分配的一些原因是什么?

典型案例:

  • 类具有引用或 const 成员。
  • 类具有不可复制分配的基类或类成员。
  • 类已显式定义移动构造函数或移动赋值运算符
  • 赋值运算符被显式删除(不适用于这种情况,因为错误消息表明运算符是隐式声明的)。

对于不太典型的情况,请参阅规范。

您可以Object通过为类显式定义复制分配运算符来使复制可分配。


PS你可以更简单地构造这样的向量:

std::vector<Object> vec(n, anExistingObject);

此复制构造向量的元素,并且不需要赋值。


推荐阅读