C++编译器选择是否自动生成代码的背后逻辑
C++编译器选择是否自动生成代码的背后逻辑
编译器会为class和struct(实际上两者在C++中是一回事)自动生成构造函数、赋值操作符函数和析构函数。如果不是这样,那么开发者就必须自己写一些枯燥冗余的代码。然而编译器并不总是生成这些默认代码,当它觉得它无法生成正确的代码时,它就会拒绝生成默认代码。在以下几种情况中,编译器会认为它无法生成正确的代码:
当开发者自己定义了构造函数时
编译器会认为开发者想要自己定义默认构造函数(即无参数的构造函数),它无法猜测开发者的想法,因此不会再自动生成默认构造函数。
当开发者自己定义了移动构造函数时
编译器认为开发者可能希望仅使用移动语义而禁止拷贝,所以拷贝构造和拷贝赋值都不再自动生成。移动赋值也不会自动生成,而是交给开发者自己来定义,因为开发者已经在定义移动语义了。
当开发者自己定义了移动赋值操作函数时
同上原因,拷贝构造和拷贝赋值不再默认生成。同样的原因,移动构造函数也不会自动生成。
当开发者自己定义了拷贝构造函数
编译器认为开发者已经自己定义了拷贝语义,无法保证能自动生成正确的移动语义的代码,所以不再自动生成此类代码。C++11标准规定也不要自动生成拷贝赋值操作符函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝赋值操作符函数代码。
当开发者自己定义了拷贝赋值操作函数时
同上原因,不再生成移动语义的代码。C++11标准规定也不要自动生成拷贝构造函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝构造函数代码。
当开发者自己定义了析构函数时
移动构造和移动赋值都涉及到资源从源对象移动到目标对象,对于源对象来说是释放了对资源的所有权。而析构函数是释放资源,所以既然用户自己定义了用于释放资源目的的析构函数,那么说明移动的语义无法保持默认的实现,因此编译器不再自动生成移动语义的代码。
当开发者自己定义了虚析构函数时
编译器不再自动生成默认析构函数代码。
C++编译器选择是否自动生成代码的背后逻辑的更多相关文章
- ButterKnife的使用以及不能自动生成代码问题的解决
ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...
- MyBatis自动生成代码示例
在项目中使用到mybatis时,都会选择自动生成实体类,Mapper,SqlMap这三个东东. 手头上在用的又不方便,找了下网上,其实有很多文章,但有些引用外部文件时不成功,也不方便,所以重新整理了下 ...
- 【MyBatis】MyBatis自动生成代码查询之爬坑记
前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...
- mybatis-generator : 自动生成代码
[参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...
- mybatis-generator自动生成代码插件
mybatis自动生成代码(实体类.Dao接口等)是很成熟的了,就是使用mybatis-generator插件. 它是一个开源的插件,使用maven构建最好,可以很方便的执行 插件官方简介: http ...
- springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)
这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...
- 【工具引入】uiautomatorviewer 查找元素后自动生成代码
缘起 公司部门调整PC部门和无线部门合并,原本负责主站PC端自动化的同事需要马上上手安卓,IOS自动化.对于初次接触移动端的测试者来说,跨度还是有点大的.加之人员有些变动,不得不搞个工具降低学习成本, ...
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...
- Eclipse 使用mybatis generator插件自动生成代码
Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...
- springboot mybatis 自动生成代码(maven+IntelliJ IDEA)
1.在pom文件中加入需要的依赖(mybatis-generator-core) 和 插件(mybatis-generator-maven-plugin) <dependency> < ...
随机推荐
- Python代码中的偏函数
技术背景 在数学中我们都学过偏导数\(\frac{\partial f(x,y)}{\partial x}\),而这里我们提到的偏函数,指的是\(f(y)(x)\).也就是说,在代码实现的过程中,虽然 ...
- java,ArrayList类
ArrayList 是一个数组列表,可以将多个对象放入数组中,是一个长度可变的集合,提供了增删改查的功能. public class Test2 { public static void main(S ...
- OpenEuler22.03安装PostgreSQL15.5并配置一主二从
环境准备 序号 IP 标识(hostname) CPU/内存配置 系统盘 数据盘 1 192.168.8.190 pg01 8C+16G 80G 500G 2 192.168.8.191 pg02 8 ...
- cs上线Linux
cs上线Linux 下载和配置crossC2 首先到项目地址:https://github.com/gloxec/CrossC2/releases下载两个文件 后缀为.cna的为cs的插件文件,启动c ...
- 探索Reactor网络模型在当今应用领域的革新
本文分享自华为云社区<驾驭网络技术的未来:探索Reactor网络模型在当今应用领域的革新>,作者: Lion Long . 本文介绍了Linux网络设计中的Reactor网络模型及其在实际 ...
- 40个问题让你快速掌握Java多线程的精髓
摘要:多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这 ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0(中)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- 背景 | 基于 Transformers 的编码器-解码器模型
!pip install transformers==4.2.1 !pip install sentencepiece==0.1.95 Vaswani 等人在其名作 Attention is all ...
- 41. 干货系列从零用Rust编写负载均衡及代理,websocket与tcp的映射,WS与TCP互转
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- mit6.s081 lab1:Unix Utilities
1 sleep(easy) 要求:为 xv6实现 UNIX 程序睡眠; 睡眠需要暂停一段用户指定的时间.刻度是由 xv6内核定义的时间概念,即定时器芯片两次中断之间的时间.解决的程序应该在 user/ ...