1、左值与右值的区别:

左值:能别赋值的值;能取到地址的值,用&能取到地址,具有持久性;

右值:临时变量;不能用&取到地址;只是字面常量值

2、右值引用

一般用的是左值引用,用&标识

右值引用通过&&获得,只能绑定到将要销毁的对象

如下例子:在代码里面进行了标识:

class MemoryBlock {

public:

//构造器

explicit MemoryBlock(int length) : length_(length), data_(new int[length]()) {

}

virtual ~MemoryBlock() {

if (data_) {

delete[] data_;

data_ = nullptr;

}

}

//拷贝构造,左值引用

MemoryBlock(const MemoryBlock &src) : length_(src.length_), data_(new int[src.length_]()){

std::copy(src.data_, src.data_+length_, data_);

}

//普通的赋值,左值引用

MemoryBlock& operator=(const MemoryBlock &src) {

if (this != &src) {

delete[] data_;

length_ = src.length_;

data_ = new int[length_]();

std::copy(src.data_, src.data_+length_, data_);

}

return *this;

}

//移动构造器,右值引用

MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_) noexcept  {

src.length_ = 0;

src.data_ = nullptr;

}

//移动赋值

MemoryBlock& operator=(MemoryBlock &&src) noexcept  {

if (this != &src) {

delete[] data_;

length_ = src.length_;

data_ = src.data_;

//将传入的参数设置为空 释放传入的数据

src.length_ = 0;

src.data_ = nullptr;

}

return *this;

}

private:

int length_;

int *data_;

};

MemoryBlock f() {

return MemoryBlock(50);

}

int main()

{

std::cout << "11111111" << std::endl;

MemoryBlock a = f();    // 调用构造器

MemoryBlock b = a;      //拷贝构造

MemoryBlock c = std::move(a);// 移动构造器,移动语义

a = f();    // 调用移动赋值运算符,移动语义

b = a;      // 调用赋值运算符

c = std::move(a); // 调用移动赋值运算符,移动语义

return 0;

}

//移动构造器

MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_)  noexcept {

src.length_ = 0;

src.data_ = nullptr;

}

  1. 、将入参传给成员
  2. 、释放传入的数据.

总结:移动构造、移动赋值仅仅是将原来存在的资源移动到其他的位置。因此其自身的资源将会被释放。

C++11:右值引用和转移赋值相关推荐

  1. std::move C++11 标准新特性: 右值引用与转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...

  2. C++11 标准新特性: 右值引用与转移语义(点评)

    <<C++11 标准新特性: 右值引用与转移语义>> 原文地址如下 http://www.ibm.com/developerworks/cn/aix/library/1307_ ...

  3. C++11 标准新特性: 右值引用与转移语义

    原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新 ...

  4. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  5. C++右值引用与转移和完美转发

    C++右值引用与转移和完美转发 1.右值引用 1.1右值 lvalue 是 loactor value 的缩写,rvalue 是 read value 的缩写 左值是指存储在内存中.有明确存储地址(可 ...

  6. C++11 右值引用和移动语义

    C++11 右值引用和移动语义 右值引用 左值与右值 对象的返回形式缺陷 ★移动语义 右值引用引用左值(move) 正确使用move的一个例子 完美转发 转发: 不转发: 右值引用作用 右值引用 C+ ...

  7. 【C++】C++11 右值引用和移动语义

    文章目录 一.左值与左值引用 二.右值与右值引用 三.左值引用和右值引用的比较 四.右值引用的使用场景和意义 1.左值引用的短板 2.移动构造和移动赋值 3.STL 容器的变化 五.万能引用与完美转发 ...

  8. C++右值引用与转移语义

    std::forwad? C++11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用. 参考: 右值引用与转移语义 转载于:https://www.cnb ...

  9. C++11 右值引用、移动语义、完美转发、万能引用

    C++11 右值引用.移动语义.完美转发.引用折叠.万能引用 转自:http://c.biancheng.net/ C++中的左值和右值 右值引用可以从字面意思上理解,指的是以引用传递(而非值传递)的 ...

最新文章

  1. 打工人,打工魂,抽终身会员,成为人上人!
  2. linux释放内存脚本
  3. Responsive设计——meta标签
  4. 互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...
  5. java 三个参数的运算符,java – 三个参数运算符:局部变量可能尚未初始化
  6. MYSQL查看和修改存储引擎
  7. Think Python - Chapter 12 Tuples
  8. SAP库存管理预留功能评测
  9. VIM-多文件-多窗口
  10. 【视觉盛宴二】长见识了,你见过BGA封装芯片的横截面吗!
  11. background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
  12. JAVA--位移运算符详细分析【转载】
  13. EntityManager:seam新手必读(一)
  14. Kotlin学习笔记18 反射Part2
  15. 马行走路线的测试用例设计
  16. 【C++笔记】表达式 语句
  17. 禁用微信浏览器的下拉_解决微信浏览器禁止下拉查看真实域名网址的问题
  18. 国内外你知道的设计网站!给你的设计找点灵感!
  19. 正高、正常高、大地高
  20. 各纬度气候分布图_高中地理丨各种气候类型分布图+气候问题全总结,再也不怕搞混了!...

热门文章

  1. CocoaPods pod install/pod update更新慢的问题
  2. Iptalbes自动封杀暴力破解(Qmail邮件系统)者的IP地址
  3. Petuum - Careers
  4. LAMP平台--部署Discuz论坛
  5. ADHD-注意力缺陷多动症
  6. IE9给我带来的惊喜和不解(For Silverlight不解)
  7. Django博客--5.让博客支持 Markdown 语法和代码高亮
  8. jboss mysql cluster_jboss配置mysql数据库连接池
  9. MySQL 之 explain
  10. Linux监控命令之 top