C++11·部分重要语法II
目录
类型分类(了解)
引用折叠
万能引用
完美转发
模版可变参数
包扩展
小知识
类型分类(了解)
C++11后,进一步对类型进行了划分,右值被划分为纯右值(pure value,简称prvalue)和将亡值(expiring value,简称xvalue)
纯右值:指字面值常量或求值结果相当于字面值常量或一个不具名的临时对象。如 42、true、nullptr或函数传值返回的返回值、临时对象或整形a++,a+b等。
将亡值:返回右值引用的函数的调用表达式和转换为右值引用的转换函数的调用表达,如move(x)、static_cast<X&&> (x)
泛左值(generalized value,简称glvalue):包含左值和将亡值。
引用折叠
C++ 中不能直接定义引用的引用,但可以通过模版或typedef中的类型操作构成引用的引用,也就是引用折叠。
规则:1.右值引用的右值引用折叠成右值引用。
2.其它所有组合折叠成左值引用。
补充:1.const变量是左值
2.const左值move之后是const右值
万能引用
![]()
传左值引用时引用折叠成左值引用,传右值引用时引用折叠成右值引用,所以叫万能引用。
注:带模版的才是万能引用。
void print(T&& tmp)
{}
像这样的只是普通右值引用。
完美转发
上篇文章提过,右值引用表达式依旧是左值。
所以如果要在万能引用的函数体中传参数会有问题,不move传的都是左值,而move之后传的都是右值。
怎么让传到fun1的参数随着tmp的类型变化而变化呢,使用forward(完美转发)
forward可以保持tmp的属性,传过来的T是左值引用,那么forward传的也是左值;如果T是右值,forward传的也是右值。
模版可变参数
C++支持可变数量参数的函数模版和类模版,可变数量的参数被称为参数包。
参数包分为两种:模版参数包(表示0或多个模版参数)、函数参数包(表示0或多个函数参数)
注:可变参数模版的原理和模版类似,本质还是去实例化对应类型和个数的多个函数。
可用sizeof计算参数包中参数个数。
包扩展
两种扩展方式
1.
2.
小知识
1.SHRT_MIN -32768 //有符号16位整形最小值
2.SHRT_MAX 32767 //有符号16位整形最大值
3.USHRT_MAX 0xffff //无符号16位整形最大值
4.INT_MIN -2147483648 //有符号整形最小值
5.INT_MAX 2147483647 //有符号整形最大值