)
一切都可以用{ }初始化在一些我们自定义的类需要当作参数传输时我们可以通过{ }直接初始化一个对象传输上去大大节省了效率右值引用的基本概念右值引用是C11引入的特性通过符号声明。它主要用于绑定临时对象右值从而支持移动语义和完美转发提升程序性能。例如上图中的常量 b指针p字符串s就是左值左值是⼀个表⽰数据的表达式⼀般是有持久状态存储在内存中我 们可以获取它的地址左值可以出现赋值符号的左边也可以出现在赋值符号右边。定义时const 修饰符后的左值不能给他赋值但是可以取它的地址。右值也是⼀个表⽰数据的表达式要么是字⾯值常量、要么是表达式求值过程中创建的临时对象等右值可以出现在赋值符号的右边但是不能出现出现在赋值符号的左边右值不能取地址。Type r1 x; Type rr1 y; 第⼀个语句就是左值引⽤左值引⽤就是给左值取别名。第⼆个就是右值引⽤同样的道理右值引⽤就是给右值取别名。左值引⽤不能直接引⽤右值但是const左值引⽤可以引⽤右值右值引⽤不能直接引⽤左值但是右值引⽤可以引⽤move(左值)move当下大家可以把他理解成把一个左值变成一个右值在一些函数中的返回值是在当前函数中的一个临时变量我们不能将他直接右值返回因为虽然右值返回了那个临时对象但是它的存储位置没有发生改变它存储的那块栈已经销毁这就导致返回的值将会变成野指针。例如这种场景下str是一个临时对象我们如果用拷贝构造也就是左值传递的话需要自己构造空间在进行交换而移动构造右值传递可以直接将需要转换的数据和临时对象进行交换而临时对象在函数结束时会跟着栈自动销毁这大大节省了效率。