C++新特性(待完善)
C++ 11的特性:
1.auto
类型推导:
auto 关键字:自动类型推导,编译器会在编译期间通过初始值或者函数返回值推导出变量的类型,通过 auto 定义的变量必须有初始值。
auto 关键字基本的使用语法如下:
auto var = val1 + val2; // 根据 val1 和 val2 相加的结果推断出 var 的类型
auto ret = [](double x){return x*x;}; // 根据函数返回值推导出 ret 的类型
auto al = { 10, 11, 12 }; //类型是std::initializer_list<int>
首先,如果初始化表达式是引用,首先去除引用;上一步后,如果剩下的初始化表达式有顶层的 const 或 volatile 限定符,去除掉。使用 auto 关键字声明变量的类型,不能自动推导出顶层的 const 或者 volatile,也不能自动推导出引用类型,需要程序中显式声明,比如以下程序:
const int v1 = 101;
auto v2 = v1; // v2 类型是int,脱去初始化表达式的顶层const
v2 = 102; // 可赋值
int a = 100;
int &b = a;
auto c = b; // c 类型为int,脱去初始化表达式的 &
初始化表达式为数组,auto
关键字推导的类型为指针。数组名在初始化表达式中自动隐式转换为首元素地址的右值。
int a[9];
auto j = a; // 此时j 为指针为 int* 类型,而不是 int(*)[9] 类型
std::cout << typeid(j).name() << " "<<sizeof(j)<<" "<<sizeof(a)<< std::endl;
注意:编译器推导出来的类型和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。
2.decltype
类型推导
decltype 关键字:decltype 是 “declare type” 的缩写,译为“声明类型”。和 auto 的功能一样,都用来在编译时期进行自动类型推导。如果希望从表达式中推断出要定义的变量的类型,但是不想用该表达式的值初始化变量,这时就不能再用 auto。decltype 作用是选择并返回操作数的数据类型。
const int&& foo();
const int bar();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1; // 类型为const int&&
decltype(bar()) x2; // 类型为int
decltype(i) x3; // 类型为int
decltype(a->x) x4; // 类型为double
decltype((a->x)) x5; // 类型为const double&
3. lambda
表达式
lambda
表达式,又被称为 lambda
函数或者 lambda
匿名函数。
[capture list] (parameter list) -> return type { function body; };
capture list:捕获列表,指 lambda 所在函数中定义的局部变量的列表。定义在与 lambda 函数相同作用域的参数引用也可以被使用,一般被称作 closure(闭包),以下为闭包的常见用法。