template <class charT, class traits = char_traits<charT> >
class basic_ios : public ios_base {
public:
…
basic_ios(const basic_ios& ) = delete;
basic_ios& operator=(const basic_ios&) = delete;
…
};

⽤ = delete 将拷⻉构造函数和拷⻉赋值运算符标记为 deleted 函数。

deleted 函数不能以任何⽅式被调⽤,即使你在成员函数或者友元函数⾥⾯调⽤,deleted 函数也不能通过编译。

通常, deleted 函数被声明为public而不是private.这也是有原因的。当客⼾端代码试图调⽤成员函数,C++会在检查 deleted 状态前检查它的访问性。当客⼾端代码调⽤⼀个私有的 deleted 函数,⼀些编译器只会给出该函数是private的错误(译注:而没有诸如该函数被 deleted 修饰的错误),即使函数的访问性不影响它的使⽤。所以值得牢记,如果要将⽼代码的"私有且未定义"函数替换为 deleted 函数时请⼀并修改它的访问性为public,这样可以让编译器产⽣更好的错误信息。

deleted 函数还有⼀个重要的优势是任何函数都可以标记为 deleted 。

bool isLucky(int number);

C++有沉重的C包袱,使得含糊的、能被视作数值的任何类型都能隐式转换为 int ,但是有⼀些调⽤可能是没有意义的:

if (isLucky('a')) … // 字符'a'是幸运数?
if (isLucky(true)) … // "true"是?
if (isLucky(3.5)) … // 难道判断它的幸运之前还要先截尾成3?

如果幸运数必须真的是整数,我们该禁⽌这些调⽤通过编译。其中⼀种⽅法就是创建 deleted 重载函数,其参数就是我们想要过滤的类型:

bool isLucky(int number); // 原始版本
bool isLucky(char) = delete; // 拒绝char
bool isLucky(bool) = delete; // 拒绝bool
bool isLucky(double) = delete; // 拒绝float和double

上⾯double重载版本的注释说拒绝float和double可能会让你惊讶,但是请回想⼀下:将 float 转换为int 和 double ,C++更喜欢转换为 double 。使⽤ float 调⽤ isLucky 因此会调⽤ double 重载版本,而不是 int 版本。好吧,它也会那么去尝试。事实是调⽤被删除的 double 重载版本不能通过编译。不再惊讶了吧。

虽然 deleted 寒暑假不能被使⽤,它它们还是存在于你的程序中。也即是说,重载决议会考虑它们。这也是为什么上⾯的函数声明导致编译器拒绝⼀些不合适的函数调⽤。

if (isLucky('a')) … //错误! 调⽤deleted函数
if (isLucky(true)) … // 错误!
if (isLucky(3.5f)) … // 错误!

最后,任何函数都能 delete。特别是可以在构造函数后面加。

 class CTest{CTest() = delete;}

本文源自《Effective Modern C++》一书。

C++ 11 deleted函数相关推荐

  1. C++11 标准新特性:Defaulted 和 Deleted 函数

    https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html Defaulted 函数 背景问题 C+ ...

  2. C++11中,对于deleted函数

    C++11中,对于deleted函数,编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性. 对于 C++ 的类,如果程序员没有为其定义特殊成员函数,那么在需要用到某个特殊成 ...

  3. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论

    一.选择题 (1)有以下程序 # include void f(char *s, char *t) { char k; k=*s; *s=*t; *t=k; s++; t--; if (*s) f(s ...

  4. 《BOOST程序库完全开发指南》 第11章 函数与回调

    第11章  函数回调 #include <iostream> #include <boost/assign.hpp> #include <boost/ref.hpp> ...

  5. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数

    33.11. 杂项函数 一如往常,总有一些函数不适合放在任何其他地方. PQfreemem 释放libpq分配的内存. void PQfreemem(void *ptr); 释放libpq分配的内存, ...

  6. Linux0.11 execve函数(六)

    系列文章目录 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Linux0.11 文件 ...

  7. 11 虚函数【C++】

    11- 判断题 1-1 虚函数是用virtual 关键字说明的成员函数. T 1-2 动态绑定是在运行时选定调用的成员函数的. T 1-3 构造函数可以声明为虚函数.F 1-4 构造函数可以声明为纯虚 ...

  8. 金仓数据库 KingbaseGIS 使用手册(6.11. 空间关系函数)

    6.11. 空间关系函数 6.11.1. ST_3DIntersects ST_3DIntersects -如果几何对象在3维空间内相交,则返回TRUE. 用法 boolean ST_3DInters ...

  9. Python学习笔记11:函数修饰符

    Python学习笔记11:函数修饰符 Python有很多有趣的特性,其中函数修饰符就是一个. 我们在之前的那个web应用示例中用过如下写法: @web.route('/log') @符号后边的,就是一 ...

最新文章

  1. 超越英伟达的,不会是另一款GPU!中国公司发布首款数据流AI芯片
  2. python 微信公众号回复图片_Python webpy微信公众号开发之 回复图文消息
  3. PHP5.4.3,有些插件不是你想用就能用的
  4. sqoop导入-hdfs
  5. C# Lambda表达式详解,及Lambda表达式树的创建
  6. 个人博客 V0.0.3 版本 ...
  7. Exchange Server 2016 独立部署/共存部署 (六)—— 创建数据库副本
  8. MFC将bmp图像设为背景
  9. 计算机程序CP电子文献,电子文献标识
  10. c++游戏编程100事列_C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码...
  11. picasa csdn_如何阻止Picasa截取不必要的屏幕截图
  12. SWIFT国际清算体系的科普贴
  13. 解决ImportError: cannot import name ‘bbox_overlaps_cython‘
  14. 怎么上传云班课的计算机作业,太棒了!云班课助你轻松玩转这9种作业!
  15. 激光三角测量物体高度
  16. java中文逗号替换成英文逗号_word如何将大量英文逗号批量替换为中文逗号?
  17. 《捉妖记》的命格解析
  18. javascript Array系列函数之9:slice拷贝一个数组
  19. 主成分分析(PCA)与矩阵奇异值分解(SVD)
  20. 零知识证明从0到1,ZK简介

热门文章

  1. 年轻人为什么白头发那么多?
  2. 类似AssistiveTouch可移动UIButton(UITouch用法)
  3. Docker - 本地镜像的导出、导入(export、import、save、load)
  4. win7更新_微软停止更新 Win7,你也许关心这四个问题。
  5. hive 元数据信息表解析
  6. 真无线蓝牙耳机哪个牌子性价比高?千元内真无线耳机推荐
  7. jqueryvalidate(猫冬插件)+spring3.0+struts2.18(集成开发)
  8. 局域网变公网的动态域名解析工具
  9. 四位二进制八位二进制及其补码
  10. 手机 APP 无法连接服务器,DNS被篡改被劫持?