首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么定义移动构造函数会删除移动赋值运算符

为什么定义移动构造函数会删除移动赋值运算符
EN

Stack Overflow用户
提问于 2019-10-02 17:18:53
回答 2查看 116关注 0票数 1

当我编写"f5() = X(33);"(当在注释行中移动构造函数时),编译器不会抛出错误。但是当我添加一个移动构造函数时,编译器说:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
" 'X &X::operator =(const X &)': attempting to reference a deleted function "

是移动构造函数删除赋值运算符吗??

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

class X {
    int* p;
public:
    X(int ii = 0) { p = new int(ii); };
    X(const X& obj) { this->p = new int(*(obj.p)); };
//  X(X&& obj) { this->p = new int(*(obj.p)); delete obj.p; obj.p=nullptr;
};



X f5() {
    return X(5);
}

int main() {

    f5() = X(33);
    system("pause");
}
EN

回答 2

Stack Overflow用户

发布于 2019-10-02 17:33:14

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f5() = X(33);

将调用赋值运算符,因为那里已经存在一个X对象。这是一项任务,而不是建筑。在你有一个移动构造函数之前,它调用一个自动生成的赋值操作符。

现在,编译器不愿意(好吧,禁止)生成默认赋值操作符,因为您实现了一个移动构造函数。逻辑是这样的,你可能更了解你的类型,所以它会让你实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X &X::operator =(const X &)
票数 3
EN

Stack Overflow用户

发布于 2019-10-02 17:48:25

错误消息('X &X::operator =(const X &)': function was implicitly deleted because 'X' has a user-defined move constructor)清楚地回答了您的问题。但是您显然想知道C++中这条规则的动机。

该规则是在C++11中引入的(与移动语义一起),以强制执行“3/5规则”,即以下所有内容必须一起使用或根本不使用:

move constructor

  • copy assignment operator

  • destructor

  • copy assignment operator
    • move constructor
    • move assignment operator

(在某些情况下,可以省略移动或复制构造函数/赋值的aiir )。

同样,在定义复制构造函数时删除复制赋值运算符也是有意义的,但为了保持向后兼容性,2011年不能这样做。

您的代码很好地说明了为什么需要3/5规则。实际上,您的类会泄漏内存。如果你用delete p添加一个析构函数,但没有定义一个移动赋值操作符,那么在你的例子中,你会得到一个双重删除(未定义的行为,可能会崩溃)。

最后,请注意您的移动构造函数是错误的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58206303

复制
相关文章
基类派生类多态虚函数?
通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。
洁洁
2023/10/10
1970
c++继承 基类 派生类 虚函数
类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。
用户7886150
2021/02/03
1.1K0
C++中派生类对基类成员的访问形式
C++中派生类对基类成员的访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对基类继承来的成员的访问。 2、对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。今天给大家介绍在3中继承方式下,派生类对基类成员的访问规则。 1、私有继承的访问规则 当类的继承方式为私有继承时,基类的public成员和protected成员被继承后成为派生类的private成员,派生类的其它成员可以直接访问它们,但是在类的外部通过派生类的对象无法访问。基类的private成员在私有派生类中是不可直接访问的
猿人谷
2018/01/17
2.4K0
Java类如何防止被实例化
有一些类不想被实例化, 比如静态方法的工具类, 这时要对类进行特殊处理 其中有两点需要注意: 防止通过new实例化 - 解决办法:使用 private 修饰符进行限制 防止通过反射实例化 - 解决办法:抛出 Error 进行限制(如果不抛出异常, 只通过private进行限制, 则通过反射依然能被实例化) 代码如下: // 不可实例化工具类 public final class MyUtils { private MyUtils() { throw new AssertionErro
夹胡碰
2020/08/14
1.8K0
基类View
在 Class-based views 源码解析 #1 中我们从宏观层面讨论了 Django 类视图的类继承结构以及命名规律。接下来我们要深入各个具体的类视图,探索其具体的代码实现。本节将分析 base.py 中最重要的的一个类,它也是所有类视图的基类 View 。 之前我们说过,尽管类视图看上去类的种类繁多,但每个类都是各司其职的,且从类的命名就可以很容易地看出这个类的功能。大致可分为如下三个大的功能块,分别由三个类提供对应的方法: 处理 HTTP 请求。根据 HTTP 请求方法的不同做出相应处理。例如同
追梦人物
2018/04/17
9110
基类和派生类
  在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。-百度百科
全栈程序员站长
2022/09/20
1K0
BaseMongo基类设计
为进一步完善框架应用,本次系列文章主要是介绍如何完善架构功能,以及如何应用架构做一些具体的应用开发。本系列课程可以在github上找到相应资源,具体每篇文章中都会提供链接。 本次介绍的主要是mongo基类的设计,以及应用。相关请查看文章下面链接下载http://5xpan.com/fs/7hueanfgd6h350fe4/(下载链接有收益,请原谅有广告)。 如果你嫌弃慢的话,也可以直接去github(https://github.com/tnodejs/BaseMongodb) 主要函数结构 私有方法
蛋未明
2018/06/07
1K0
MVC的基类
设计一个验证用户身份是否登陆的基类BaseController /// <summary> /// 所有需要进行登录控制的控制器基类 /// </summary> public class BaseController : Controller { /// <summary> /// 当前登录的用户属性 /// </summary> public UserInfo CurrentUserInfo { get;
欢醉
2018/01/22
7840
Thinkphp的公共函数和类有什么区别?
比如我要写一个用户验证(CheckUser),我可以写在Common的function.php中,也可以写在Model里的CheckUserModel.class.php里。他们有什么区别? func
PM吃瓜
2019/08/13
1K0
Azure App Service 如何防止staging环境被匿名访问
我们经常使用Azure App Service里的slot来创建staging等测试环境,但它们也都暴露在互联网上,只要知道URL的人就能访问。本文就来教大家如何做到只允许内部人员访问测试地址。
Edi Wang
2019/07/09
9000
Azure App Service 如何防止staging环境被匿名访问
python抽象基类abc
python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。
用户2936342
2018/08/27
8380
okhttp-公共类
http://blog.csdn.net/lmj623565791/article/details/47911083 参照了鸿洋_大神的代码重写了自己需要的方法
tea9
2022/07/16
2440
如何加载第三方类库/项目类库/基类库?
如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,官方文档原话
PM吃瓜
2019/08/13
1.3K0
python 抽象基类 abstractmethod
class IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): pass
用户5760343
2019/12/13
7690
python的抽象基类
与jvm上的语言不一样,python的语言没有interface关键字,而且除了抽象基类,每个类都有相应的接口:类实现或继承的公开属性(方法或数据类型)
哒呵呵
2018/08/06
8980
C++虚基类
如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。
卡尔曼和玻尔兹曼谁曼
2019/01/25
1.1K0
C++虚基类
c++-基类与派生类
友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。
kdyonly
2023/03/03
3930
nodejs流基类源码分析
流的基类只提供了一个函数就是pipe。用于实现管道化。这个方法代码比较多,分开说。
theanarkh
2020/07/22
6170
EasyC++81,抽象基类
我们之前说过,在我们实现继承的时候,需要保证派生类和基类之间是一种is-a的关系。在大多数时刻,这样的关系是没有问题的,然而在一些特殊的情况可能会遇到问题。
TechFlow-承志
2022/08/26
3130
C++核心准则​讨论:将基类的析构函数设为公共和虚拟的,或受保护的和非虚拟的
Discussion: Make base class destructors public and virtual, or protected and non-virtual 讨论:将基类的析构函数
面向对象思考
2020/12/15
1.1K0

相似问题

如何访问基类的公共数据成员?

31

防止用作私有基类的类的公共用途

31

从基类访问联合的公共部分

54

重写基类的虚函数,基类不共享公共接口

20

C++装饰器:从外部访问基类的公共函数

116
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文