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> < ...
随机推荐
- IIS下使用SSL证书
IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1. 生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...
- spring是否线程安全
spring 管理的bean默认是单例的,可通过 scope 属性设置scope="singleton" 默认是单例,可修改为scope="prototype" ...
- 『Flutter』开篇
什么是 Flutter Flutter 是由 Google 开发的开源框架 Flutter 用于构建跨平台的移动应用程序 Flutter 它允许开发者使用同一套代码来同时为 IOS 和 Android ...
- zabbix常用监控项
https://blog.csdn.net/xkjcf/article/details/78559273?locationNum=10&fps=1 agent.ping #agent是否在线 ...
- reboot详解
linux下reboot命令详解 linux reboot 命令详解 功能说明:重新开机. 语 法:dreboot [-dfinw] 补充说明:执行reboot指令可让系统停止运作,并重新开机. 参 ...
- Typora 掘金小册主题
主题说明 此主题样式基本来源于掘金小册学习界面 下载地址:https://github.com/easylee1996/typora-juejin-theme 主题预览 主题文档示例 如何使用 克隆仓 ...
- 聊聊Llama2-Chinese中文大模型
转载请注明出处:https://www.cnblogs.com/zhiyong-ITNote 基本简述 Llama2-Chinese 大模型:由清华.交大以及浙大博士团队领衔开发:基于200B中文语料 ...
- 文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题
四.一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数. 已知需要邀请的人数为:23人 根 ...
- nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接
nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题. 替换成openres ...
- rasa train nlu详解:1.1-train_nlu()函数
本文使用<使用ResponseSelector实现校园招聘FAQ机器人>中的例子,主要详解介绍train_nlu()函数中变量的具体值. 一.rasa/model_training.p ...