首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

试图引用已删除的函数operator=时出现编译器错误C2280

是C++编译器的错误提示,它表示在尝试使用已删除的赋值运算符时发生了错误。这通常是因为类的赋值运算符被显式地删除或者通过继承自基类而被隐式地删除。

赋值运算符(operator=)是一个特殊的成员函数,用于将一个对象的值赋给另一个对象。当一个类没有显式定义赋值运算符时,编译器会自动生成一个默认的赋值运算符。然而,有时候我们希望禁止对象之间的赋值操作,可以通过将赋值运算符声明为私有成员函数或者将其删除来实现。

当我们尝试使用已删除的赋值运算符时,编译器会报错。这是为了防止意外的赋值操作,因为已删除的函数不能被调用。

解决这个错误的方法是检查代码中是否存在对已删除的赋值运算符的调用,并确保只调用可用的赋值运算符。如果需要禁止对象之间的赋值操作,可以将赋值运算符声明为私有成员函数,并在函数体中抛出一个异常来阻止赋值操作。

以下是一个示例代码,演示了如何禁止对象之间的赋值操作:

代码语言:cpp
复制
class MyClass {
private:
    MyClass& operator=(const MyClass&) = delete;  // 删除赋值运算符

public:
    MyClass() {}
    // 其他成员函数和数据成员...
};

int main() {
    MyClass obj1;
    MyClass obj2;
    
    obj1 = obj2;  // 编译器错误C2280,尝试使用已删除的赋值运算符
    return 0;
}

在这个示例中,我们将赋值运算符声明为私有成员函数,并使用= delete语法将其删除。这样一来,当我们尝试在main函数中使用赋值运算符时,编译器会报错。

总结起来,编译器错误C2280表示尝试引用已删除的赋值运算符,解决方法是检查代码中对赋值运算符的调用,并确保只调用可用的赋值运算符。如果需要禁止对象之间的赋值操作,可以将赋值运算符声明为私有成员函数并删除它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Visual C++ 中重大更改

重大更改为,如果你之前使用是具有相同签名运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,在使用 placement new 点位置出现,因为在代码中该位置...标准要求为,如果使用 placement new 查找相应 delete 函数和常用释放函数,则程序会出现格式错误。...早期版本编译器生成了匿名联合显式构造函数和析构函数。 这些在 Visual Studio 2015 中 Visual C++ 中删除。           ...在 C++ 中,考虑名称解析候选对象,可能会出现作为潜在匹配项考虑一个或多个名称生成无效模板实例化情况。...           va_start 和引用类型 编译 C++ 代码, va_start 现在会在编译验证传递给它参数是否为引用类型。

5.2K10

Visual C++ 中重大更改

重大更改为,如果你之前使用是具有相同签名运算符 delete(以与 placement new 运算符对应),你将收到编译器错误(C2956,在使用 placement new 点位置出现,因为在代码中该位置...标准要求为,如果使用 placement new 查找相应 delete 函数和常用释放函数,则程序会出现格式错误。...早期版本编译器生成了匿名联合显式构造函数和析构函数。 这些在 Visual Studio 2015 中 Visual C++ 中删除。           ...在 C++ 中,考虑名称解析候选对象,可能会出现作为潜在匹配项考虑一个或多个名称生成无效模板实例化情况。...           va_start 和引用类型 编译 C++ 代码, va_start 现在会在编译验证传递给它参数是否为引用类型。

4.8K00
  • 【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

    类型参数列表 数据类型 ; 此时 , 在继承 , 被继承 类模板 必须 声明 类型参数列表 , 将具体泛型类型写在尖括号中 , C++ 编译器需要知道 具体 数据类型 是什么 , 才能生成...类 模板 需要 模板 参数列表 " 错误 ; 报错信息如下 : 启动生成… 1>------ 启动生成: 项目: HelloWorld, 配置: Debug Win32 ------ 1>Test.cpp..., 声明 子类实例对象 , Son son; 会报错 error C2280: “Son::Son(void)”: 尝试引用删除函数 ; 启动生成… 1>------ 启动生成: 项目:...: “Son::Son(void)”: 尝试引用删除函数 1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(22):...): message : “Son::Son(void)”: 由于 基类“Father”不具备相应 默认构造函数 或重载解决不明确,因此隐式删除函数 1>D:\002_Project\006

    99130

    【C++】构造函数初始化列表 ① ( 类对象作为成员变量构造函数问题 | 构造函数初始化列表语法规则 )

    一、类对象作为成员变量构造函数问题 1、问题描述 如果 一个类 A 对象 作为 另外一个类 B 成员变量 , 在以下场景会报错 : 为类 A 定义 有参 构造函数 , 那么 A 无参默认构造函数就失效了...无参构造函数创建 A 对象 , 但是 A 无参构造函数无法使用 , 必须使用 A 有参构造函数 , 这里就出现问题 , 报错 “B::B(void)”: 由于 数据成员“B::m_a”不具备相应...默认构造函数 或重载解决不明确,因此隐式删除函数 ; class B { public: int m_age; // 年龄 A m_a; // A 类型成员变量 }; 解决上述问题方案...: “B::B(void)”: 尝试引用删除函数 1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22...(22,1): message : “B::B(void)”: 由于 数据成员“B::m_a”不具备相应 默认构造函数 或重载解决不明确,因此隐式删除函数 1>D:\002_Project\006_

    62630

    【细品C++】类和对象一些细节(初始化列表、友元、static成员等)

    不过希望我对这些知识整理能帮助你更好理解这部分知识。 深究构造函数 构造函数体赋值与初始化 在创建对象编译器通过调用构造函数,给对象中各个成员变量一个合适初始值。...这个坑就是,当编译器默认生成构造函数处理自定义类型成员变量,如果该类没有默认构造函数(无参或者全缺省构造函数,会编译不通过。...: “date::date(void)”: 尝试引用删除函数 //message : 编译器已在此处生成“date::date” //message : “date::date(void)”:...由于 数据成员“date::_T”不具备相应 默认构造函数 或重载解决不明确,因此隐式删除函数 return 0; } 所以,在这里,初始化列表又派上用场了。...从概念上讲,可以认为构造函数分两个阶段执行: (1)初始化阶段(函数体之前);(2)普通计算阶段。(函数体内) 常规地使用初始化列表,可以避免使用只能在初始化列表初始化类成员出现编译错误

    46020

    《Effective C++》读书笔记(2):构造析构赋值运算

    至于生成拷贝构造函数和拷贝操作符只是单纯将每个非静态成员变量拷贝;有const成员或者引用成员,以及基类拒绝拷贝操作符,默认生成拷贝操作符没有意义,必须自己定义。...可以让它们继承上面的类,即可禁止编译器生成拷贝操作:编译器试图为它们生成拷贝构造/拷贝运算符时会尝试调用基类Uncopyable对应操作,而这会被拒绝。...如果析构函数可以抛出异常,那么清空局部资源时局部对象析构函数再次异常同时存在两个异常,C++无法处理,可能会过早结束或出现不明确行为。...对于派生类构造函数而言,进入其中基类部分构造完而派生类部分未构造完,对象类型是基类,故而此时调用虚函数,实际上使用是基类函数。 析构函数同理。...“自我赋值安全性”,但不具备“异常安全性”:例如当new Bitmap异常,pb指向被删除内存。

    15530

    C ++ 中不容忽视 25 个 API 错误设计!

    客户端通过构造函数在eth堆栈上创建了类a1实例。然后他通过从a1复制创建了另一个实例a2。当a1超出范围,析构函数删除底层int *内存。...=(const MyArray& a) = delete; }; 此时,当客户端尝试复制类,他将遇到编译错误:error C2280: ‘MyArray::MyArray(const MyArray...因此,在我们例子中,如果要使类不可复制和不可移动,我们将标记移动构造函数和movbe赋值操作符为删除。...=(MyArray&& a) = delete; }; 附加警告:如果为类定义了复制构造函数(包括将其标记为删除),则不会为该类创建移动构造函数。...错误#20:向发布类API添加纯虚方法 为什么这是一个错误

    1.5K20

    《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

    书中补充②编译器拒绝为类生出operator=情况: 第一种情况:类成员变量中,存在引用声明 第二种情况:存在const修饰成员变量。...p = s;//error,报错显示operator删除函数 return 0; } 赋值不成功理由很简单,引用指向是不可以被改变,赋值的话就说明要改变引用指向对象。...这样做好处是,如果有人在类中调用了这些被私有化函数,或者使用友元,那么会在连接期出现错误,而并非编译期错误。如果是发生在连接期错误,这种错误很难侦测出来!...因此,这种做法就是将连接错误转移到了编译期,那么只要有人试图调用这些规定不能用函数,就会在编译期报错!...6.条款10:令operator=返回一个reference to *this 也就是让赋值重载函数返回值是一个引用返回,这样是为了可以实现连锁赋值。

    36310

    第 13 章 拷贝控制

    编译器略过了拷贝构造函数 在一个构造函数中,成员初始化是在函数体执行之前完成,且按照它们在类中出现顺序进行初始化。...// 错误,析构函数删除 NoDtor *p = new NoDtor(); // 正确,但是不能 delete p delete p; // 错误 在某些情况下,编译器会将合成拷贝控制成员定义为删除...试图拷贝对象用户代码在编译阶段被标记为错误(因为不可访问),成员函数或友元中拷贝操作将会导致链接错误(因为只有声明没有定义)。...有类成员定义了自己拷贝构造函数且未定义移动构造函数,或者是有类成员未定义自己拷贝构造函数编译器不能为其合成移动构造函数,移动构造函数会被定义为删除。...引用限定符必须同时出现函数声明和定义中。

    1K50

    C++初阶大全

    引用不是新定义一个变量,而是给存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用变量共用同一块内存空间。...3.拷贝构造函数 那在创建对象,可否创建一个与存在对象一某一样新对象呢?...拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用存 在类类型对象创建新对象编译器自动调用。 拷贝构造函数也是特殊成员函数,其特征如下: 1....函数形参表: 必须要和模板函数基础参数类型完全相同,如果不同编译器可能会报一些奇怪错误。...出现模板编译错误时,错误信息非常凌乱,不易定位错误 知识点总结(易遗漏): 临时对象具有常性 函数返回值具有常性 隐式类型转换也有常性,因为转换过程,需要创建临时变量 全特化和偏特化和仿函数

    5710

    C++初阶

    引用不是新定义一个变量,而是给存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用变量共用同一块内存空间。...3.拷贝构造函数 那在创建对象,可否创建一个与存在对象一某一样新对象呢?...拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用存 在类类型对象创建新对象编译器自动调用。 拷贝构造函数也是特殊成员函数,其特征如下: 1....函数形参表: 必须要和模板函数基础参数类型完全相同,如果不同编译器可能会报一些奇怪错误。...出现模板编译错误时,错误信息非常凌乱,不易定位错误 知识点总结(易遗漏): 临时对象具有常性 函数返回值具有常性 隐式类型转换也有常性,因为转换过程,需要创建临时变量 全特化和偏特化和仿函数

    10010

    C++基础 智能指针

    对于普通 局部变量(非静态局部变量),当离开它作用域,操作系统会自动将其释放。类对象在释放时候是会自动调用该类析构函数。...于是我们就想:如果是Test *t不是一个普通指针变量,而是一个类对象的话,并且在类析构函数中实现了释放动态内存步骤,那么只要该指针变量一退出作用域就会调用析构函数,达到了释放动态内存目的。...对于特定对象,同一刻只能有一个智能指针可拥有, 最终只有拥有对象智能指针构造函数删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高指针,跟踪引用特定对象智能指针个数...如果将上述代码中auto_ptr换为unique_ptr,在程序编译就会提示错误,因而它可以在编译将潜在错误暴露出来: error C2280: 'std::unique_ptr<int,std...因为shared_ptr采用引用计数,当执行完赋值语句py = px后,px和py都指向同一块内存,只不过在释放空间因为事先要判断引用计数值大小,因此不会出现多次删除一个对象错误

    62020

    Effective c++ 小结

    用 const好处是,调试,可以直接获取变量,而非定义数字,这个在使用gdb跟踪代码时候很有用,比如#define NUM 123;如果在gdb中print NUM,会出现NUM找不到符号表问题...编译器内部确定是按照class内声明次序,如果初始化列表不同,很可能初始化列表数据会错误。 核心:先按class内声明成员默认赋值,然后调用初始化参数列表进行初始化。...必须返回一个对象不要试图返回一个引用 用重载乘法举例 Inline const Rational Operator*( const Rational& lhs, const Rational...看来是该和那些开放式模块变量定义吻别了。 需要时候再定义,延缓定义式出现,当出错就会减少内存使用。 条款33: 明智地使用内联 内联函数------多妙主意啊!...所以当内联一个函数编译器可以对函数体执行特定环境下优化工作。这样优化对"正常"函数调用是不可能

    79250

    C++11——引入新关键字

    auto不能用来声明函数返回值。但如果函数有一个尾随返回类型,auto是可以出现函数声明中返回值位置。...这种情况下,auto并不是告诉编译器去推断返回类型,而是指引编译器函数末端寻找返回值类型。在下面这个例子中,函数返回值类型是operator+操作符作用在T、U类型变量上返回值类型。...上面的代码是错误,因为 D1 试图继承 B1,而 B1 被 final声明为终结类,类似于Java关键字作用。 (2)final用于修饰虚函数。...operator }; 上面的代码,就可以让编译器生成上面六个函数默认版本。...一个表达式可以被计算为 bool 或 string (字符串),如果这个表达式值为 false ,那么编译器出现一个包含特定字符串错误,同时编译失败。如果为 true 那么没有任何影响。

    1.4K50

    翻译 | 为什么QObject子类不可复制?

    ; 使用Qt5并使用C++11(支持=delete): 错误:使用删除函数’MyClass::MyClass(const MyClass&)’ 或更早版本: 错误:'QObject::QObject...但是为什么要删除复制构造函数(以及赋值运算符)?如果您仍要复制该怎么办?如果它不可复制,那么它可以移动吗?以下文章将研究这些问题,并探讨在自定义子类中重复删除操作是否是一种好习惯。...QObjects可以在运行时使用新属性进行扩展。副本是否也应该继承这些新属性?   一般来说,QObjects是通过它们指针地址被其他对象引用。例如,前面提到信号和槽机制就是这种情况。...但是,由于复制构造函数删除,所以不会隐式地生成move构造函数,如果开发人员试图移动QObject,就会报编译器错误。   ...=(const Class &) Q_DECL_EQ_DELETE; 不在子类中添加宏,则显示以下错误消息: 错误:使用删除函数’MyClass::MyClass (const MyClass&)

    98810

    《C++Primer》第十三章 拷贝控制

    voctor v1(10); // 正确: 直接初始化 vector v2 = 10; // 错误:接收大小参数构造函数是explicit 1.5 编译器可以绕过拷贝构造函数...对于一个删除了析构函数类型,编译器将不允许定义该类型变量或创建该类来临时对象 如果一个类有某个成员类型删除了析构函数,我们也不能定义该类变量或者临时对象 对于删除了析构函数类型,我们虽然不能定义这种类型变量或者成员...,但是可以鼎泰分配这种类型对象,但是不能释放这些对象 6.3 合成拷贝控制成员可能是删除 对于有些类来说,编译器生成合成拷贝控制成员可能被定义为删除函数: 如果类某个成员析构函数删除或者不可访问...如果一个类有一个拷贝构造函数但是未定义移动构造函数编译器不会合成移动构造函数。这种情况下函数匹配规则保证该类型对象会被拷贝,即使我们试图通过调用move来移动他们。...类似于const限定符,引用限定符只能用于非static成员函数,且同时出现函数声明和定义中。 2.

    1.6K40

    【c++】类与对象(中)

    2.构造函数 2.1概念 构造函数是一个特殊成员函数,名字与类名相同,创建类类型对象编译器自动调用,以保证每个数据成员都有 一个合适初始值,并且在对象整个生命周期内只调用一次。...注意: 2.2构造函数不可以使用重载情况 当构造函数调用存在歧义,在编译时会出现错误。...注意:创建哪个类对象则调用该类析构函数,销毁那个类对象则调用该类析构函数 4拷贝构造函数 拷贝构造函数:只有单个形参,该形参是对本类类型对象引用(一般常用const修饰),在用存在类类型...拷贝构造函数是构造函数一个重载形式。 拷贝构造函数参数只有一个且必须是类类型对象引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。...尽量使用引用类型,返回根据实际场景,能用引用尽量使用引用

    14610

    学过 C++ 你,不得不知这 10 条细节!

    如下面的 PI 宏定义,在程序编译编译器在预处理阶段,会先将源码中所有 PI 宏定义替换成 3.14: #define PI 3.14 程序编译在预处理阶段后,才进行真正编译阶段。...在有的编译器,运用了此 PI 常量,如果遇到了编译错误,那么这个错误信息也许会提到 3.14 而不是 PI,这就会让人困惑哪里来3.14,特别是在项目大情况下。...---- 细节 02 小结 - 请记住 将某些东西声明为 const 可帮助编译器探测出错误用法。const 可以被施加于任何作用域内对象、函数参数、函数返回类型、成员函数本体。...编译器拒绝为 class 创建 operator= 函数情况:(1) 内含引用成员、(2) 内含 const 成员、(3)基类将 operator= 函数声明为 private。...即使没有加 if 自我判断,这段代码还是能够处理自我赋值,因为我们对原 B 做了一份副本、删除原 B 、然后返回引用指向新创造那个副本。 它或许不是处理自我赋值最高效方法,但它行得通。

    75120

    【C++】类和对象 (中篇)

    拷贝构造函数:只有单个形参,该形参是对本类类型对象引用 (一般常用const修饰),在用存在类类型对象创建新对象编译器自动调用。...拷贝构造也是特殊成员函数,其特征如下: 拷贝构造函数是构造函数一个重载形式,当我们使用拷贝构造实例化对象编译器不再调用构造函数; 拷贝构造函数参数只有一个且必须是类类型对象引用,使用传值方式编译器直接报错...,所以编译器自动传递了对象地址,并且在函数中使用一个 this 指针来接收,导致函数参数变成了三个;所以出现了 “operator += 参数太多” 这个报错; 那么为了解决这个问题,我们在定义 operator...另外,上面这个问题除了在定义对象出现之外,在成员函数中也会出现,且十分频繁,特别是运算符重载 – 当运算符重载两个参数都是类对象,如果我们不会改变类内容,比如只比较大小,我们通常会将函数形参定义为...、打开文件,那么需要我们显式定义析构函数; 3、拷贝构造 拷贝构造函数是用一个存在对象去初始化另一个正在实例化对象,由编译器在实例化对象自动调用; 拷贝构造参数必须为引用类型,否则编译器报错

    67200

    C++继承(多继承、菱形继承?)

    / 基类指针 / 基类引用。...但是一般情况下编译器会自己帮我们去调用父类析构函数,所以无需我们在子类析构函数中调用父类析构函数!(后面会讲) Ⅴ....派生类默认成员函数 6个默认成员函数,“ 默认 ” 意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成呢?...() { B b; //❌ return 0; } 运行结果: error C2280: “B::B(void)”: 尝试引用删除函数 message : 编译器已在此处生成“B::B”...message : “B::B(void)”: 由于基类调用删除或不可访问函数“A::A(void)”,因此隐式删除函数 父类 A 构造函数私有化后 B 就无法构造对象,因为 B 构造函数必须要调用

    2K20
    领券