统一列表初始化:
构造函数的函数名与函数体之间增加一个列表,用于对成员初始化
在实例化对象时,支持单/多参数的隐式转化,同时也可以省略=符号,让代码更简洁
右值的引用
左值:
- 左值与右值的重要区别就是能否取地址,左值可以取地址,右值不能取地址(这并不带表右值没有地址)
- 左值,右值的底层都是指针
- 左值不一定是一个值,也有可能是一个表达式
- 在函数中,左值引用作为返回值,返回函数中的局部对象不可取,会返回一个野引用
右值:
- &&能给右值取别名
- 左值引用&不能给右值取别名,但加了const修饰可以
- 右值的引用本身是左值
- 函数调用返回的值,表达式返回的值等都叫右值
string("11111"); func1(2);//函数调用,func1返回一个Int int x,y=1; x+y;
纯右值&将亡值
- 纯右值是内置类型
- 将亡值是自定义类型
万能引用
完美转发forward:
在模板中,接受左值,就转化为左值,接受右值就转化为右值
移动构造和移动赋值
- 在函数调用中,参数使用右值引用可以在函数调用结束后,转移资源,相比于传统的写法来讲,降低了代价,传统写法,函数调用结束后,会有一个拷贝构造和一个赋值拷贝,但右值引用直接解决了这一问题,只需要把资源转移即可。
- 举例:人在快要失去生命时,会选择留下自己的器官造福别人,这里转移了将亡的人的器官资源,道理与右值引用的类似
- 移动构造和移动赋值针对的是深拷贝的自定义类型对象。
lambda
- 参数列表可省略,返回值可省略
- lambda就算内容一模一样,类型也是不一样的。lambda的底层是由仿函数实现的
- lambda的捕捉列表
- 传值捕捉
- 传引用捕捉
- 混合捕捉