右值 移动
来源:互联网 发布:java游戏引擎 编辑:程序博客网 时间:2024/06/02 18:55
左值:有地址有名称的变量叫做左值
右值:字面常量或者创建的临时对象
左值引用:常见的我们使用的&a就是左值引用,必须绑定到左值中
右值引用:为了支持移动操作引用的一种类型,通过&&获得,必须绑定到右值中,将被绑定的对象的资源“移动”到另一个对象中(指向要被销毁的对象)
int &&a=3;//正确
int &&b=a;//错误,表达式a是左值
例如在StrVec中使用移动操作更高效(vector)
void StrVec::reallocate()
{
auto newcapacity=size()?2*size()+1;
auto newdata=allo.allocate(newcapacity);
auto dest=newdat;//指向新数组
auto elem=elements;//指向旧数组
for(size_t i=0;i!=size();i++)
alloc.construct(dest++,std::move(*elem++));//这里使用移动操作,将旧数组中string管理的内存空间所有权给新数组(有点类似auto_ptr转让所有权+浅拷贝)
free();//释放旧的内存空间
//更新我们的数据结构,执行新元素
elements=newdata;
first_free=dest;//指向最后一个构造元素之后的位置
cap=elemnets+newcapacity;//指向新分配空间的尾后位置
}
move函数:可以显式的将左值转换为对应的右值引用类型
int &&b=std::move(a);//ok
move调用告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它.调用move意味着:除了对a赋值或销毁它,我们将不再使用它,在调用move后,我们不能对移后源对象的值做任何的假设(不能使用一个移后源对象的值).
移动构造函数和移动赋值运算符
保证销毁移后源对象是无害的,一旦资源完成移动,源对象必须不再指向被移动的资源
StrVec(StrVec &&s) noexcept
:elements(s.elements),first_free(s.first_free),cap(s.cap)
{
//令s进入这样的状态——对其运行析构函数是安全的
s.elements=s.first_free=s.cap=nullptr;
}
- 右值 移动
- 右值以及移动函数
- 右值引用,移动语义,完美转发
- 右值引用 移动语义 完美转发
- C++:右值引用与移动构造
- c++11移动语义右值引用
- 右值引用和移动构造
- 右值引用与移动构造函数、移动赋值
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板
- C++ 0x 之左值与右值、右值引用、移动语义、传导模板
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
- 右值引用背后的移动语意和完美传递
- C++新特性 右值引用 移动构造函数
- C++11右值引用:移动语义和完美转发
- c++11中的右值引用以及移动构造
- c++ 特性: 右值引用与移动语义
- C++11新特性:移动语义和右值引用
- Java NIO之文件监控机制
- 3DSlicer33:Adding MRML
- ubuntu16.04+cuda8.0+cudnn6+tensorflow安装
- 从豆瓣电影评分算法说起
- 资本寒冬,这十大创业公司值得尊重(上)
- 右值 移动
- 协同过滤-皮尔逊相关系数算法
- Angular4 环境搭建与项目创建与发布
- 利用python进行数据分析译者给出的注意事项
- c# 图片浏览器
- POJ 1131 Octal Fractions——高精度
- C++template(模板)的使用
- PMCAFF微课堂 (已结束)| 京东平台产品负责人:如何打造一个支撑3200万日订单量的平台型产品
- C#中的foreach和yield