1.1类型推导
(1)auto类型推导
auto声明的变量必须马上初始化,让编译器推断出他的实际类型,并在编译时将auto占位符替换为真正的类型。
在旧标准中,他代表具有自动存储周期的局部变量。
auto int i =0;
static int =j 0;
但在c++11新标准中,auto关键字不在存储类型指示符,而是改成了一个类型指示符,用来提示编译器对此类型的变量做类型的自动推导
auto的推导规则
1.当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致
2.当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性
auto的限制
1.auto不能用于函数参数
auto能用于static const的整型或者枚举成员
c++11可以接受非静态成员变量的就地初始化,但不支持auto类型非静态成员变量的初始化
auto类型是一个很强大的工具,但任何工具都有他的两面性,不加选择的随意使用auto,会带来代码可读性和维护性的严重下降,因此在使用auto的时候,一定要权衡好他带来的价值和相应的损失
(2)decltype关键字
1.获知表达式的类型
2.drcltype的推导规则decltype(exp)
a.exp是标识符,类访问表达式,decltype(exp)和exp的类型一致
b.exp是函数调用,decltype(exp)和返回值类型一致
c.其他情况,若exp是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致
(3)返回类型后置语法–结合使用
需要返回值后置,前置语法在返回值定义的时候参数还不存在
template<typename T , typename U>
auto add(T t,U u) ->decltype(t+u)
{
return t+u;
}
1.2模板的细节改进
(1)模板的右尖括号
(2)模板的别名
(3)函数模板的默认模板参数是
1.3列表初始化
(1)统一的初始化
(2)列表初始化的使用细节
(3)初始化列表
(4)防止类型收窄
1.4基于范围的for循环
(1)for循环的新用法
(2)基于范围的for循环的使用细节
(3)让基于范围的for循环支持自定义类型
1.5std::function和bing绑定器
(1)可调用对象
(2)可调用对象包装器std::function
(3)std::bind绑定器
1.6lambda表达式
(1)lambda表达式的概念和基本用法
(2)声明式的编程风格,简洁代码
(3)在需要的时间地点实现闭包。
1.7tuple元组