转载自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. 华为自带浏览器绕坑大法!
  2. python获取系统信息模块psutil
  3. GVA gin-vue-admin前后端部署教程
  4. iptables之iptables命令详解
  5. mysql反向生成uml类图_UML类图自动生成,太爽了
  6. 切图崽的自我修养-规范CSS元素命名
  7. python人工智能原理及其应用_人工智能原理与实践:基于Python语言和TensorFlow
  8. java和python对比----1:
  9. jquery实现:返回顶部(动画·代码精简版)- 代码篇
  10. centos7更换和升级JDK版本
  11. 在windows中使用scp命令将文件上传到远端服务器
  12. 基于大数据平台的异常检测场景分析方案
  13. 运动目标检测之关键帧提取、二帧差法及三帧差法
  14. 测绘工程专业与计算机,测绘工程专业的计算机技术教学
  15. DW CS5及CC的部分序列号总结
  16. Redisson延迟队列
  17. python解二元一次方程_Python数据处理篇之Sympy系列(五)---解方程
  18. 物联网数据卡系统源码——物联网的主要应用领域
  19. Javascript静态变量与实例变量
  20. vue整合dorado框架

热门文章

  1. 用C语言实现字符串的右旋
  2. Demo 示例:如何原生的在 K8s 上运行 Flink?
  3. 【React Native 安卓开发】----(Flexbox布局)【第二篇】
  4. Python的学习必备基础知识总结
  5. python---post请求时其中dict中套有json
  6. python复利代码_python复利
  7. 遗传算法优化的bp神经网络_【首发推荐】农学:基于遗传BP神经网络的采摘机器人手眼标定研究...
  8. python控制台动画,如何使用Python 3.x在控制台应用程序中创建ASCII动画?
  9. 16kb等于多少b_MySQL为何选择B+树存储索引?
  10. python dataframe列名_pandas 修改 DataFrame 列名