【Json11源码阅读】05 问题解答,Part_3
问题1
Json(std::string &&value);
Json(array &&values);
Json(object &&values);
&&
是什么意思?
疑问
&&
是什么意思?
解题思路
看了下书的目录,没找到这个符号,于是百度,得知这东西叫右值引用,再回去找书就容易啦
P471
解答
所谓右值引用就是必须绑定到右值的引用
只能绑定到一个将要销毁的对象
是新标准为了支持移动操作引入的
那么什么是移动操作呢?
在某些情况下,对象拷贝后就立即被销毁了。在这些情况下,移动而非拷贝对象会在幅度提升性能
对于IO类或unique_ptr
这样的类,它们都包含不能被共享的资源。因此,这些类型的对象不能拷贝但可以移动。
和普通引用一样,右值引用也只是某个对象的别名而已。区别就在于右值引用绑定的是一个将要销毁的对象
int i = 42;
int &r = i;
int &&rr = i;
int &r2 = i * 42;
const int &r3 = i * 42;
int &&rr2 = i * 42;
其中rr和r2的定义是错误的
左值持久;右值短暂
左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象
int &&rr1 = 42;
int &&rr2 = rr1;
其中rr2
的定义是错误的,因为rr1
是变量,是持久的,而右值引用只能绑定到临时对象
标准库move函数
如果想让右值引用绑定到左值对象上,可以使用标准库提供的move函数
int &&rr3 = std::move(rr1);
调用move
后,只能对rr1
进行两种操作:赋值和销毁
std::move
定义在头文件utility中
参考资料
c++ primer
471
END
微信公众号:马志峰的编程笔记
记录一名普通程序员的成长之路