Spaces in Template Expressions模板表达式中的空格
nullptr and std::nullptr_t
(1)用nullptr代替0和NULL;空指针;
(2)nullptr的类型是std::nullptr_t,定义在头文件cstddef中;
自动类型判断auto
(1)之前auto就是局部变量的意思,但是现在auto表示自动类型判断;
(2)编译器本身就具备自己判断类型的能力;
auto关键字
首先判断版本支持C++2.0;标准库本身也在使用auto;
这里是reverse_iterator是迭代器适配器,利用到了迭代器萃取机进行提问回答difference_type的类型作为函数返回类型;
Uniform Initialization一致性的初始化
(1)之前的初始化可能用到{},(),=赋值;
(2)任意的初始化都可以统一用{}进行初始化,设置初值;
(3)因为编译器遇到{}时会自动生成一个initializer_list< T >,其中T就是int,int,string,double这些,背后 其实是一个array,n是元素个数,然后一个一个传给调用的函数(就是int values的构造函数),如果本身接受的就是initial_list,就不用一个一个赋值,直接整个传过去;
(4)使用容器是通过调用容器的构造函数,接受initializer_list< T >
(5)没有像容器那样的构造函数是,将传入的数据分解再传入
initializer_list
使用{}不允许窄化转换;例如double转int是不被允许的;但编译器通常会给出警告而不是错误
initializer_list的应用
- 此处也是对应任意数量的参数,对应生成一个initializer_list,但是注意,这里的类型只能一致指定的int,因为其背后实现是一个array数组;和tuple不同,tuple更加强大,任意数量任意类型;
- 这也是应用initializer_list<>的一个方法;
(1)当是complex< T > 时就调用版本1构造函数;因为使用complex时
(2)如果没有版本2,q,s还可以使用,因为会被拆解成两个参数,就可以调用版本1,r则不合法操作;
(3)右侧是initailizer_list的源代码实现;其data是一个arary的迭代器(指向array的头部),size_type元素个数;编译器看到{}可以调用initializer_list类private中的一个构造函数,(外部都不可以调用),在看到{}之后就会调用此处,(在调用这个隐私构造函数前,编译器会提前创建一个array并把其头迭代器传入此函数参数中)
p s={77,5};//调用构造函数
s=q;//需要重载运算符=
initializer_list<>没有内含array
并没有内含着一个array容器,构造函数只是传入一个array迭代器;因此在拷贝的时候,还是相同的元素,传递的只是指针而已(浅拷贝);原来的一包和新的一包指向同一个array;
initializer_list<>在库中应用广泛,说明可以接收数量不定的参数
使用测试
array容器
就可以与STL对接,数组就变成一个容器了,因为算法只跟迭代器对接;
array内含一个数组