尝试引用已删除的函数时出错

Error attempting to reference a deleted function

本文关键字:函数 出错 删除 引用      更新时间:2023-10-16

我想使用传递给初始化构造函数的参数初始化Enemy::copy,但出现以下错误:

C2280: 'Enemy &Enemy::operator =(const Enemy &)': attempting to reference a deleted function

以下是class Enemy声明:

 #include "Pickup.h"
 class Enemy : public Entity
 {
 private:
        std::vector<Pickup>& copy;
 public:
        Enemy::Enemy(std::vector<Pickup>& arraypickup) : copy(arraypickup) {} 
 };

而来自main()的代码:

std::vector<Pickup> arraypickup;
Enemy enemy(arraypickup);

我该如何解决?

这个答案是基于@Praetorian的正确建议。

带有修复的简短答案:

问题出在 Enemy 类的std::vector<Pickup>& copy;成员中。 将其更改为 std::vector<Pickup> copy; ,删除引用,以修复错误。事实上,绝对没有必要将vector存储为引用,相反,如您所见,在类中具有引用成员会导致您遇到的错误。您可能对vector是通过引用初始化 c'tor 传递的事实感到困惑,但这绝不意味着您也应该将类成员作为引用。

如果您仍然希望通过引用存储Enemy::copy数据,例如性能问题,请考虑将其设置为指针,如下所示:

class Enemy : public Entity
 {
 private:
        std::vector<Pickup>* copy;
 // rest of the class...
 };

长答案:

重现问题的代码:

class Foo
{
    int& ri;
public:
//    default c'tor can't be defined in a sane fashion  because of the reference member ri
//    Foo() : ri(0) {}
    Foo(int& _ri) : ri(_ri) {}
};
int main(int argc, char **argv)
{
    int i{42};
    Foo f1{i};
    Foo f2{f1}; // we don't have a default constructor so using auto-generated copy c'tor
    f2 = f1; // <--- error
    return 0;
}

导致错误:

main.cpp: In function 'int main(int, char**)':
main.cpp:14:12: error: use of deleted function 'Foo& Foo::operator=(const Foo&)'
         f2 = f1; // <--- error
            ^
main.cpp:1:11: note: 'Foo& Foo::operator=(const Foo&)' is implicitly deleted
                     because the default definition would be ill-formed:
     class Foo
           ^
main.cpp:1:11: error: non-static reference member 'int& Foo::ri',
                      can't use default assignment operator

解释:

自动生成

operator=(),在这种情况下会生成[1],被认为是ill-formed,因为您无法在C++[2]中重新分配引用。自动生成的operator=(Foo& other)如果存在,将尝试执行this->ri = other.ri,这被认为是不正确的("格式错误",如编译器所报告的那样(,因为它是对引用ri的重新分配。

最后,我建议看[3],对这个问题有深入的回答。

  1. 关于自动生成的复制赋值运算符

  2. 关于重新指定参照

  3. 存在引用的赋值运算符和复制构造函数