【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


微信公众号:马志峰的编程笔记

记录一名普通程序员的成长之路

posted @ 2017-04-17 08:14  马志峰  阅读(273)  评论(0编辑  收藏  举报