博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左值、右值、右值引用与move()、forward()
阅读量:6972 次
发布时间:2019-06-27

本文共 1406 字,大约阅读时间需要 4 分钟。

1、左值(lvalue):可以进行取地址(&)运算的是左值。或者有时候可以理解为 既能够出现在等号左边也能出现在等号右边的变量(或表达式)。

2、右值(rvalue):不可以进行取地址(&)运算的是右值。或者有时候可以理解为 只能出现在等号右边的变量(或表达式)。

  • 常见的右值有 字面量、函数返回的临时对象,匿名对象等。
  • 以上判断一个对象是左值还是右值并不完全正确。
const int c_a = 10;        //左值,但是不能被赋值,也就不能出现在 = 左边//字符串字面值,可以取地址,是左值,但是也不能位于等号左边&("我只左值");                //正确//有时候右值是可以位于等号左边的string s1, s2;s1 + s2 = "它是右值但是能被赋值“;

 

3、右值引用(rvalue referrence):是C++11引入的一个新类型。右值有一下特性:

  • 可以直接绑定到右值。
  • 不能直接绑定到左值。
  • 本身是一个左值。可以进行 &运算。
  • 右值能被 const 类型的引用绑定。
  • 可以使用move()将左值绑定到右值引用上。
int a = 10;int &b = a;    int &&c = a * 10;       //右值引用直接绑定右值const int &d = a * 20;    //右值引用绑定到const型引用 int &&e = a;          //错误。无法将右值引用绑定到左值int *f = &e;                 //右值引用可以进行&运算int &&g = move(a);        //使用move()将左值绑定到右值引用上
  • 可以使用move()将左值绑定到右值引用上。
  • move调用告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它。我们必须认识到,调用move就意味着承诺:除了对rr1赋值或销毁它外,我们将不再使用它在调用move后,我们不能对移后源对象的值做任何假设。我们可以销毁一个移后源对象,也可以赋予它新值,但是不能使用一个移后源对象的值。

  • std::forward()。 函数原型:std::forward<T>(u) 有两个参数:T 与 u。当T为左值引用类型时,u将被转换为T类型的左值,否则u将被转换为T类型右值。如此定义std::forward是为了在使用右值引用参数的函数模板中解决参数的完美转发问题。
//forwardtemplate
inline _Tp&& forward(typename std::remove_reference<_Tp>::type& __t) { return static_cast<_Tp&&>(__t); } int a = 10;int &b = forward
(a);    //返回左值引用int &&c = forward
(a);   //返回右值引用int &&d = forward
(a);     //返回右值引用

 

转载于:https://www.cnblogs.com/peformer/p/9087360.html

你可能感兴趣的文章
iOS:UIPageViewController翻页控制器控件详细介绍
查看>>
网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)...
查看>>
SQLServer游标(Cursor)简介和使用说明
查看>>
iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)...
查看>>
asp.net中实现登陆的时候用SSL
查看>>
Git常用命令总结【转】
查看>>
PostgreSQL中的AnyEnum例子
查看>>
Delphi 中的 XMLDocument 类详解(14) - 遍历 XML 文件
查看>>
《gradle 用户指南》中文版 第2章 概述
查看>>
Dockerfile指令
查看>>
FFmpeg 学习资料
查看>>
Redis实现分布式锁
查看>>
Phonegap 工作原理
查看>>
连载-第2章 嵌入式系统工程设计概述
查看>>
Vector3.forward
查看>>
ubuntu-学习笔记之1-9
查看>>
8086汇编语言(1)虚拟机安装ms-dos 7.1
查看>>
C#多线程编程之:lock使用注意事项
查看>>
DI,DIP,IOC的演变历史 <转>
查看>>
oracle extract()截取时间值函数
查看>>