转载自http://www.stroustrup.com/C++11FAQ.html

仅供个人参考, 收藏用

control of defaults: move and copy

By default, a class has 5 operations:

  • copy assignment
  • copy constructor
  • move assignment
  • move constructor
  • destructor

If you declare any of those you must consider all and explicitly define or default the ones you want. Think of copying, moving, and destruction as closely related operations, rather than individual operations that you can freely mix and match - you can specify arbitrary combinations, but only a few combinations make sense semantically.

If any move, copy, or destructor is explicitly specified (declared, defined, =default, or =delete) by the user, no move is generated by default. If any move, copy, or destructor is explicitly specified (declared, defined, =default, or =delete) by the user, any undeclared copy operations are generated by default, but this is deprecated, so don't rely on that. For example:

    class X1 {      X1& operator=(const X1&) = delete;    // Disallow copying    }; 

This implicitly also disallows moving of X1s. Copy initialization is allowed, but deprecated.

   class X2 {      X2& operator=(const X2&) = delete;    }; 

This implicitly also disallows moving of X2s. Copy initialization is allowed, but deprecated.

   class X3 {      X3& operator=(X3&&) = delete; // Disallow moving     }; 

This implicitly also disallows copying of X3s.

  class X4 {      ~X4() = delete;    // Disallow destruction    }; 

This implicitly also disallows moving of X4s. Copying is allowed, but deprecated.

I strongly recommend that if you declare one of these five function, you explicitly declare all. For example:

    template<class T>     class Handle {      T* p;   public:         Handle(T* pp) : p{pp} {}        ~Handle() { delete p; }     // user-defined destructor: no implicit copy or move           Handle(Handle&& h) :p{h.p} { h.p=nullptr; }            // transfer ownership      Handle& operator=(Handle&& h) { delete p; p=h.p; h.p=nullptr; return *this; }    // transfer ownership          Handle(const Handle&) = delete;        // no copy         Handle& operator=(const Handle&) = delete;        // ...     }; 

See also

the C++ draft section ???[N2326==07-0186] Lawrence Crowl: Defaulted and Deleted Functions.[N3174=100164] B. Stroustrup: To move or not to move. An analysis of problems related to generated copy and move operations. Approved.

转载于:https://www.cnblogs.com/likeatree/p/4193886.html

Stroustrup 谈 C++ 11的新特性相关推荐

  1. 从Folly源码学C++ 11的新特性

    两年前Facebook发布了他们的C++库,命名为Folly,这是一个在Facebook内部广泛和可重复使用的C++库组件大集合. 但很多成熟的C++开源库已经存在了,为什么又引进一个呢?除了这个库的 ...

  2. C++11 的新特性

    C++11 的新特性 1 变量和基本类型 1.1 long long 类型 扩展精度浮点数,10位有效数字 1.2 列表初始化 初始化的几种不同形式,其中用花括号来初始化变量称为列表初始化: 比如: ...

  3. atitit.Oracle 9 10 11 12新特性attilax总结

    atitit.Oracle 9  10 11  12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1.   审计简介 1 1.4. ...

  4. C++11 标准新特性:委派构造函数

    https://www.ibm.com/developerworks/cn/rational/1508_chenjing_c11/index.html 陈 晶 2015 年 8 月 11 日发布 We ...

  5. C++11 标准新特性: 右值引用与转移语义(点评)

    <<C++11 标准新特性: 右值引用与转移语义>> 原文地址如下 http://www.ibm.com/developerworks/cn/aix/library/1307_ ...

  6. C++11学习 新特性之 “=default” 、“=delete”

    文章目录 1. =default 和=delete 概述 2. 类与默认函数 3. 使用"=delete"来限制函数生成 4. "=default"使用范围 1 ...

  7. Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例

    Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例 目录 文章目录 1.count:计数-终结方法 2.limit:取前几个元素-延迟方法 3.skip: ...

  8. Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2

    Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2 目录 文章目录 1.Stream流特点 2.filter:过滤 3.map:映射 ***后记*** : 内 ...

  9. Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1

    Java复习第11天---11.2---Java8新特性---Stream流获取方式和常用方法1 目录 文章目录 1.Stream流的2中获取方式 1.1.集合的stream方法 1.2.Stream ...

  10. C++11语言新特性-《C++标准库(第二版)》读书笔记

    文章目录 3.1.1 微小但重要的语法提升 Template 表达式内的空格 nullptr 和std::nullptr_t 3.1.2 以auto 完成自动类型推导 3.1.3 一致性初始化(Uni ...

最新文章

  1. 推荐 | 机器学习开源项目 Top 10
  2. linux下载哪个python版本-Linux下升级安装Python-3.6.2版本
  3. Flutter Dart 安装在window系统
  4. 2020计算机考研初试考试先后顺序,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  5. 生产订单成本的计划、控制和结算
  6. Python学习笔记:字符串和编码
  7. 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
  8. 深入分析 Java 方法反射的实现原理
  9. maven 加入第三方库_关于maven,你还要翻阅多少资料才能整理出这一份完整文档...
  10. IOS开发之Cocoa编程—— NSUndoManager
  11. 解答网友提问 | 使用VS2022快速生成React/Angular/Vue.js + Web API前后端集成项目
  12. 如何清理电脑c盘_【电脑】第一期干货:如何正确清理C盘?
  13. Ubuntu 15.10 默认壁纸?
  14. 安全企业 Stormshield 披露数据泄露事件 源代码被盗
  15. 关于SpringBoot和Thymeleaf模板中遇到的问题
  16. 18. jQuery - 尺寸
  17. 侦听键盘,将data写入文件data.out(成功版本)
  18. silverlight:手写板/涂鸦/墨迹/InkPresenter示例程序
  19. 数据结构详解之栈和队列
  20. matlab中序列的dtft,dtft的matlab

热门文章

  1. Docker与容器化-03-使用Dockerfile创建镜像
  2. JQuery的一些简单使用
  3. 数据结构-01-链表数据结构之单链表
  4. 美团猫眼电影Android模块化实战总结
  5. 浅谈计算机网络技术应用及发展,【网络技术论文】计算机网络技术的应用及发展(共2891字)...
  6. 黑进mysql_连接到MySQL数据库
  7. python实现excel的覆盖写入和追加
  8. 文件怎么更新_iOS屏蔽更新描述文件以及超级详细安装方法分享
  9. linux ftp指定下载文件名称,linux中通过FTP下载指定的文件方法linux网页制作 -电脑资料...
  10. CASE WHEN 及 SELECT CASE WHEN的用法