从Folly源代码中学习C ++ 11的新功能。
五年前,Facebook发布了名为Folly的C ++库,该库是Facebook内部广泛使用的大量可重用C ++库组件的集合。
但是存在许多成熟的C ++开源库,为什么要引入另一个库呢? 这是其实用程序背后的网站动机:
Folly(在Facebook开放源代码库之后缩写,简称Folly)是一个C ++ 11组件库,在设计时考虑了实用性和效率。 它补充了(而不是与之竞争)Boost等产品,当然还有
std
。 实际上,只有在所需的东西不可用或不满足所需的性能概要时,我们才着手定义自己的组件。
例如,这是为什么Folly引入另一个向量类FBVector的详细解释 。 就像Folly开发人员所声称的那样,它是一个C ++ 11组件库,如果您查看它们的源代码,这将完全证实这一点,并且广泛使用了C ++ 11功能,此外,几乎所有新的C ++ 11使用功能。
几年前宣布c ++ 0x时,我以为它不会对C ++语言产生很大的影响,但是我错了,看看Folly的这段代码片段,看起来它是使用一种新语言开发的。
相同的说法几乎涉及所有愚蠢的源代码,其实现看起来与c ++ 03源代码不同。
对于有兴趣掌握C ++ 11新功能的开发人员,更好的方法是发现成熟的库如何使用它们。Folly是探索这些新功能的很好的候选人。 让我们从其源代码中发现其中的一些。
1-自动
C ++ 11使用auto关键字引入了类型推断功能,这意味着编译器在声明时推断变量的类型。 Folly几乎对所有变量声明都使用了auto,这是源代码中的一个示例
使用auto关键字允许花费更少的时间写出编译器已经知道的内容。
2-nullptr
常量0具有常量整数和null指针常量的双重作用.C ++ 11通过引入一个新关键字来充当专有的null指针常量来更正此错误:
在Folly源代码中,所有空指针都由新关键字nullptr表示,没有地方使用常数0。
3- shared_ptr
智能指针不是一个新概念,许多库是在多年前实现的,流行的是boost :: shared_ptr ,新功能是它的标准化,并且不再需要使用外部库来处理智能指针。
Folly广泛使用标准化的共享指针,其源代码中只保留了很少的原始指针。
4-强类型的枚举
C ++中的“传统”枚举会在周围的范围内导出其枚举数,如果同一范围内的两个不同枚举都具有范围定义相同名称的枚举数,则可能导致名称冲突;
C ++ 11引入了enum类关键字。 他们不再在周围的范围内导出其枚举数。 而且,我们现在还可以从枚举继承。
5-静态断言
C ++ 11引入了一种新的方法来测试编译时的断言,它使用new关键字static_assert,此功能对于将条件添加到模板参数非常有用,如Folly源代码中的以下模板类所示:
6-可变参数模板
可变参数模板是一个模板,可以采用任意数量的任意类型的模板参数。 这两个类和函数都可以是可变参数。Folly定义了许多可变参数模板,这是来自Folly源代码的两个可变参数模板函数:
7-基于范围的循环
C ++ 11扩展了for语句,以支持对集合进行迭代的“ foreach”范例。 它使代码更简单,更简洁。 Folly广泛使用此功能,这是Folly的一个示例
8-启动器列表
在C ++ 03中,Initializer列表仅与数组有关,而在C ++ 11中,不再仅针对数组。 接受{} -list的机制是一个函数(通常是构造函数),接受类型为std :: initializer_list <T>的参数 。 这是一个函数接受std :: initializer_list作为参数的示例
这就是它的调用方式
9-无例外
如果一个函数不能引发异常,或者如果该程序未编写为处理该函数引发的异常,则可以将该函数声明为noexcept。
这是Folly源代码中的一个示例
10动
C ++ 11引入了右值引用(用&&指定)的概念,以区分对左值或右值的引用。 左值是具有名称的对象,而右值是不具有名称的对象(临时对象)。 移动语义允许修改右值。
为此,C ++ 11引入了两个新的特殊成员函数: move构造函数和move赋值运算符 。
这是一个很好的文档 ,可以更好地解释移动语义的好处。
11-lambda
C ++ 11提供了创建匿名函数(称为lambda函数)的功能,您可以在此处参考有关此新功能的更多详细信息。
Folly在许多函数中使用它,这是其源代码的示例:
12-明确默认和删除的特殊成员函数
在C ++ 03中,对于不为其自身提供类的类,编译器为其提供默认构造函数,副本构造函数,副本分配运算符( operator=
)和析构函数。 程序员可以通过定义自定义版本来覆盖这些默认值。
但是,对这些默认值的创建几乎没有控制权。 例如,使类本质上不可复制,需要声明一个私有副本构造函数和副本赋值运算符,而不定义它们。
在C ++ 11中,可以明确禁用某些功能。 例如,以下类型是不可复制的,这使代码更加简单和干净。
13-覆写识别码
在C ++ 03中,当打算覆盖基类函数时可能会意外地创建一个新的虚函数。
override
特殊标识符意味着编译器将检查基类,以查看是否存在具有此确切签名的虚函数。 如果没有,编译器将指示错误。
Folly广泛使用此新功能:
14- std :: thread
提供了一个线程类( std::thread
),该类需要一个函数对象以及传递给它的可选参数序列在新线程中运行。
在C ++ 11中,使用线程的工作更加简化,这是来自Folly源代码的定义新线程的新标准方法:
15-无序容器
无序容器是一种哈希表。 C ++ 11提供了四个标准的:
- unordered_map
- 无序集
- unordered_multimap
- unordered_multiset
愚蠢在许多地方使用这些新容器
结论
Folly几乎使用了所有新的C ++ 11功能,探索其源代码将使您对新的C ++功能及其实现方式有了更好的了解。
我鼓励任何对C ++ 11感兴趣的C ++开发人员放下Folly源代码,并发现新语言的强大功能。
From: https://hackernoon.com/learn-from-folly-source-code-the-new-c-11-features-121823fdd525
从Folly源代码中学习C ++ 11的新功能。相关推荐
- 还可以这么玩:盘点iOS 11中Siri的12项新功能
本文讲的是 还可以这么玩:盘点iOS 11中Siri的12项新功能, iOS 11的首次亮相带来了一些变化,其中包括增强现实游戏和更好的iMessage体验,但或许操作系统在任何方面的改变都不如Sir ...
- Ableton Live 11 mac新功能
Ableton Live 11 Suite新功能介绍 一.用新设备创建 Meet Wavetable,Echo,Drum Buss和Pedal:Live的乐器和效果可能带来全新的声音效果. 1.Mee ...
- android 无线充电架构,大神发现Android 11隐藏新功能:反向无线充电放心了
原标题:大神发现Android 11隐藏新功能:反向无线充电放心了 今天,谷歌正式发布了Android 11开发者预览版,不过XDA大神在研究Pxiel 4的Android11系统时,发现了隐藏的新功 ...
- AI 可以从人类思维中学习的11个启示
☉文章 | Gary Marcus.Ernest Davis ☉来源 | AI科技评论 1969 年图灵奖得主.MIT 人工智能实验室创始人马文·明斯基(Marvin Minsky)在其1986年著作 ...
- 从Folly源码学C++ 11的新特性
两年前Facebook发布了他们的C++库,命名为Folly,这是一个在Facebook内部广泛和可重复使用的C++库组件大集合. 但很多成熟的C++开源库已经存在了,为什么又引进一个呢?除了这个库的 ...
- 您应该知道的ES2020中的10个JavaScript新功能
Good news – the new ES2020 features are now finalised! This means we now have a complete idea of the ...
- android p新功能_android 11 android的11大新功能
android p新功能 In this article we will discuss about what android provides in new OS updates. And How ...
- Windows 11 企业版新功能介绍
很多用户都升级了Windows 11企业版,那么Windows 11元有哪些新功能呢? 生产力和协作功能 新的安全功能 基于云的管理和云配置(Cloud Config) 通用打印 应用兼容性 ...
- datastage配置jdbc_Datastage 11.5新功能介绍----Hive Connector
Question Datastage是否有专门的组件支持Hive呢? Answer 在最新的IBM Information Server 11.5.0.1中,新增了一些组件和功能,其中比较重要的就是H ...
最新文章
- Spring Security 入门(四):自定义-Filter
- Idea之使用Gradle开发Java项目
- 二维码QR Code不是一个产品,是一个功能
- Linux LB 集群知识、如何用 LVS 方式实现 LB 集群?
- 判断指定目录下的所有[图片]的扩展名, 并打印出文件名.
- @ImportResource()注解的使用
- [转载]在iTOP-4412开发板上调试helloworld应用
- c++ 11之 lambda表达式的使用
- 产品经理书籍_rate
- java gbk转机内码_gbk内码转中文方法
- 推荐几个好用的 html5 游戏源码下载网站
- 计算机基础中关于二进制,计算机基础二进制十进制.ppt
- 智能优化算法:白鲸优化算法-附代码
- Swift之深入解析如何处理非可选的可选项类型
- 训练营四教官打死网瘾少年案今开庭审理
- 怎么通过iTools解决闪退,应用无法安装激活的办法
- amh升级php版本,AMH4.2升级PHP版本后续之组件安装
- 心灵鸡汤:谦虚、不沉默、有危机感、不断努力
- 1、股票交易及量化投资回测分析系统的数据库设计-5
- Logback - SiftingAppender
热门文章
- MySQL(MariaDB):解决“ Host ‘*‘ is not allowed to connect to this MariaDB server”
- Python多线程、多进程最全整理
- python 离线安装驱动
- 图解HTTP学习_day11
- python3_面向对象
- 340. 至多包含K个不同字符的最长子串
- [转]网站整合Ucenter详细流程
- Browser --- 更换bookmark、homepage及常见问题
- 智慧城市背景下的“多规合一”标准探究
- linux 脚本usleep,Linux的sleep()和usleep()的使用