淡:
....................
....................
C++11
C++11,先前被称作C++0x,即
ISO/IEC 14882:2011。
Wikipedia:C++11
Wikipedia: C++ Technical Report 1
C++11/14/17 Features In VS 2015 RTM
右值引用
C++11增加一个新的非常量引用(reference)类型,称作右值引用(R-value reference),标记为T &&。右值引用所绑定的临时对象可以在该临时对象被初始化之后做修改,这是为了允许move语义。(Wikipedia:C++11)
POD
Wikipedia:
POD (程序设计)
Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构[1],POD适用于需要明确的数据底层操作的系统中。
说人话:POD是标准委员会的老家伙们搞的一组底层数据标准,想让某些C++对象可以跨平台交互。
Lambda
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
nullptr
C++11引入了新的关键字来代表空指针常量:nullptr,将空指针和整数0的概念拆开。nullptr的类型为nullptr_t,能隐式转换为任何指针或是成员指针的类型,也能和它们进行相等或不等的比较。而nullptr不能隐式转换为整数,也不能和整数做比较。(wikipeida:C++11)
为了向后兼容,0仍可代表空指针常量。
枚举类别的前置声明(forward declaration)
0000
enum Enum1; // C++與C++11中不合法;無法判別大小
enum Enum2 : unsigned int; // 合法的C++11
enum class Enum3; // 合法的C++11,列舉類別使用預設型別int
enum class Enum4: unsigned int; // 合法的C++11
enum Enum2 : unsigned short; // 不合法的C++11,Enum2已被聲明為unsigned int
using别名
类型别名
using也能在C++11中定义一般类型的别名,等同typedef:
typedefvoid(*PFD)(double); // 傳統語法
usingPFD=void(*)(double); // 新增語法
模板别名
template< typename first, typename second, int third>
class SomeType;
template< typename second>
using TypedefName = SomeType
;
可变参数模板
在C++11之前,不论是类模板或是函数模板,都只能按其被声明时所指定的样子,接受一组固定数目的模板参数;C++11加入新的表示法,允许任意个数、任意类别的模板参数,不必在定义时将参数的个数固定。
template<typename...Values>classtuple;
使用或禁用对象的默认函数
传统C++默认构造函数规则:
若用户定义了任何构造函数,编译器便不会生成默认构造函数。
否则,编译器自动生成四个构造函数:默认构造函数(default constructor)、复制构造函数(copy constructor),赋值运算符(copy assignment operatoroperator=)以及析构函数(destructor)
C++11允许显式地表明采用或拒用编译器提供的内置函数
structNonCopyable
{
NonCopyable&operator=(constNonCopyable&)=delete;
NonCopyable(constNonCopyable&)=delete;
NonCopyable()=default;
};
= delete的声明(同时也是定义)也能适用于非内置函数,禁止成员函数以特定的形参调用:
structNoDouble
{
voidf(inti);
voidf(double)=delete;
};
static_assert
想在编译器测试模板参数的特性,只能用static_assert
template
structCheck
{
static_assert(sizeof(int)<=sizeof(T),"T is not big enough!");
};
hash
C++11四种散列表,其中差别在于底下两个特性:是否接受具相同键值的项目(Equivalent keys),以及是否会将键值映射到相对应的数据(Associated values)。为避免与第三方库发展的散列表发生名称上的冲突,前缀将采用unordered而非hash。
散列表类型 有无关系值 接受相同键值
std::unordered_set 否 否
std::unordered_multiset 否 是
std::unordered_map 是 否
std::unordered_multimap 是 是
头文件: <unordered_set>和<unordered_map>
正则表达式
头文件:<regex>
通用智能指针
shared_ptr是一引用计数(reference-counted)指针,其行为与一般C++指针极为相似。在TR1的实现中,缺少了一些一般指针所拥有的特色,像是别名或是指针运算。C++11新增前述特色。
一个shared_ptr只有在已经没有任何其它shared_ptr指向其原本所指向对象时,才会销毁该对象。
一个weak_ptr指向的是一个被shared_ptr所指向的对象。该weak_ptr可以用来决定该对象是否已被销毁。weak_ptr不能被解引用;想要访问其内部所保存的指针,只能透过shared_ptr。有两种方法可达成此目的。第一,类别shared_ptr有一个以weak_ptr为参数的构造函数。第二,类别weak_ptr有一个名为lock的成员函数,其回返值为一个shared_ptr。weak_ptr并不拥有它所指向的对象,因此不影响该对象的销毁与否。
元编程
对于那些能自行创建或修改本身或其它程序的程序,我们称之为元编程。这种行为可以发生在编译或运行期。
XXXX
0000
0000
XXXX
0000
0000