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

时间:2018-11-06 16:32:52

标签: c++

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

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

auto member = anExistingObject;

然后正常工作。我只想为每个向量元素制作一个anExistingObject的副本。为什么第一种方法会引发错误?

1 个答案:

答案 0 :(得分:0)

  

为什么第一种方法会引发错误?

错误消息说明:

  

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

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

  

但是,如果我说

auto member = anExistingObject;
     

然后正常工作

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


  

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

典型案例:

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

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

您可以通过为该类显式定义副本分配运算符来使Object可进行副本分配。


P.S。您可以更简单地像这样构造向量:

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

此副本-构造矢量的元素,并且不需要分配。