C++编译器选择是否自动生成代码的背后逻辑

编译器会为class和struct(实际上两者在C++中是一回事)自动生成构造函数、赋值操作符函数和析构函数。如果不是这样,那么开发者就必须自己写一些枯燥冗余的代码。然而编译器并不总是生成这些默认代码,当它觉得它无法生成正确的代码时,它就会拒绝生成默认代码。在以下几种情况中,编译器会认为它无法生成正确的代码:

  1. 当开发者自己定义了构造函数时

    编译器会认为开发者想要自己定义默认构造函数(即无参数的构造函数),它无法猜测开发者的想法,因此不会再自动生成默认构造函数。

  2. 当开发者自己定义了移动构造函数时

    编译器认为开发者可能希望仅使用移动语义而禁止拷贝,所以拷贝构造和拷贝赋值都不再自动生成。移动赋值也不会自动生成,而是交给开发者自己来定义,因为开发者已经在定义移动语义了。

  3. 当开发者自己定义了移动赋值操作函数时

    同上原因,拷贝构造和拷贝赋值不再默认生成。同样的原因,移动构造函数也不会自动生成。

  4. 当开发者自己定义了拷贝构造函数

    编译器认为开发者已经自己定义了拷贝语义,无法保证能自动生成正确的移动语义的代码,所以不再自动生成此类代码。C++11标准规定也不要自动生成拷贝赋值操作符函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝赋值操作符函数代码。

  5. 当开发者自己定义了拷贝赋值操作函数时

    同上原因,不再生成移动语义的代码。C++11标准规定也不要自动生成拷贝构造函数代码,因为用户接管了拷贝语义的定义,但是Visual Studio仍然会生成拷贝构造函数代码。

  6. 当开发者自己定义了析构函数时

    移动构造和移动赋值都涉及到资源从源对象移动到目标对象,对于源对象来说是释放了对资源的所有权。而析构函数是释放资源,所以既然用户自己定义了用于释放资源目的的析构函数,那么说明移动的语义无法保持默认的实现,因此编译器不再自动生成移动语义的代码。

  7. 当开发者自己定义了虚析构函数时

    编译器不再自动生成默认析构函数代码。

C++编译器选择是否自动生成代码的背后逻辑的更多相关文章

  1. ButterKnife的使用以及不能自动生成代码问题的解决

    ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...

  2. MyBatis自动生成代码示例

    在项目中使用到mybatis时,都会选择自动生成实体类,Mapper,SqlMap这三个东东. 手头上在用的又不方便,找了下网上,其实有很多文章,但有些引用外部文件时不成功,也不方便,所以重新整理了下 ...

  3. 【MyBatis】MyBatis自动生成代码查询之爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  4. mybatis-generator : 自动生成代码

    [参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...

  5. mybatis-generator自动生成代码插件

    mybatis自动生成代码(实体类.Dao接口等)是很成熟的了,就是使用mybatis-generator插件. 它是一个开源的插件,使用maven构建最好,可以很方便的执行 插件官方简介: http ...

  6. springboot学习随笔(四):Springboot整合mybatis(含generator自动生成代码)

    这章我们将通过springboot整合mybatis来操作数据库 以下内容分为两部分,一部分主要介绍generator自动生成代码,生成model.dao层接口.dao接口对应的sql配置文件 第一部 ...

  7. 【工具引入】uiautomatorviewer 查找元素后自动生成代码

    缘起 公司部门调整PC部门和无线部门合并,原本负责主站PC端自动化的同事需要马上上手安卓,IOS自动化.对于初次接触移动端的测试者来说,跨度还是有点大的.加之人员有些变动,不得不搞个工具降低学习成本, ...

  8. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

    原文链接 我们这一篇博客讲的是如何整合Springboot和Mybatis框架,然后使用generator自动生成mapper,pojo等文件.然后再使用阿里巴巴提供的开源连接池druid,这个连接池 ...

  9. Eclipse 使用mybatis generator插件自动生成代码

    Eclipse 使用mybatis generator插件自动生成代码 标签: mybatis 2016-12-07 15:10 5247人阅读 评论(0) 收藏 举报 .embody{ paddin ...

  10. springboot mybatis 自动生成代码(maven+IntelliJ IDEA)

    1.在pom文件中加入需要的依赖(mybatis-generator-core) 和 插件(mybatis-generator-maven-plugin) <dependency> < ...

随机推荐

  1. 数据智慧:C#中编程实现自定义计算的Excel数据透视表

    前言 数据透视表(Pivot Table)是一种数据分析工具,通常用于对大量数据进行汇总.分析和展示.它可以帮助用户从原始数据中提取关键信息.发现模式和趋势,并以可视化的方式呈现. 在数据透视表中,数 ...

  2. Arrarylist集合的使用

    前提:最近JAVA实训课老师讲了一些Arrarylist集合的相关知识,刚好端午假期有空就把这课上学到的知识和自己碰到的一些问题总结下来. 一.Arrarylist集合的使用(以学生信息存储作为演示) ...

  3. 学一点关于JVM类加载的知识

    要研究类加载过程,我们先要知道关于 Java 处理代码的流程是怎么样的. 第一步:编写源代码 这一步是我们最熟悉的,就是我们在 idea 上写的业务代码,生成 Example.java 文件. pub ...

  4. MyBatisPlus-使用步骤

    MyBatisPlus-使用步骤 第一步 引入maven坐标依赖 <dependency> <groupId>com.baomidou</groupId> < ...

  5. SQL优化案例(1):隐式转换

    MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...

  6. 防火墙配置SNMP

    深信服AC配置SNMP 深信服AF配置SNMP 深信服AD配置SNMP 在接口上启用是snmp管理,平台有网神的mib,可以都读到数据

  7. Windows下编译并使用64位GMP

    目录 1. 概述 2. 编译 2.1. GCC环境 2.2. 编译过程 3. 使用 3.1. 调用 3.2. 示例 4. 参考 1. 概述 GMP是一个开源的数学运算库,它可以用于任意精度的数学运算, ...

  8. Java程序接入ChatGPT

    目录 0 前言 1 还想体验的小伙伴可以试试 2 Java接入前准备 3 官方支持接入语言 4 调用费用 5 接口调用说明 6 代码实现 6.1 postman调用 6.2 Java调用 7 小结 0 ...

  9. 云图说|新一代Serverless应用托管引擎——CAE

    本文分享自华为云社区<云图说|新一代Serverless应用托管引擎--CAE>,作者:阅识风云. 开发运营一个应用软件,面临种种挑战:软件栈厚重.开发上线慢.资源易浪费.运维投入高.突发 ...

  10. 解决大模型“开发难”,昇思MindSpore自动并行技术应用实践

    本文分享自华为云社区<DTSE Tech Talk|第35期:解决大模型"开发难",昇思MindSpore自动并行技术应用实践>,作者华为云社区精选. 昇思MindSp ...