首页 > 其他分享 >右值引用

右值引用

时间:2024-06-22 19:20:26浏览次数:6  
标签:std 纯右值 右值 左值 C++ 引用 字面

右值引用

右值引用是 C++11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C++ 中大量的历史遗留问题,消除了诸如 std::vector、std::string 之类的额外开销,也才使得函数对象容器 std::function 成为了可能。

左值、右值的纯右值、将亡值、右值

要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。

左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式(不一定是赋值表达式)后依然存在的持久对象。

右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。

而 C++11 中为了引入强大的右值引用,将右值的概念进行了进一步的划分,分为:纯右值、将亡值。纯右值 (prvalue, pure rvalue)

  • 纯粹的右值,要么是纯粹的字面量,例如 10, true;
  • 要么是求值结果相当于字面量或匿名临时对象,例如 1+2。
  • 非引用返回的临时变量、运算表达式产生的临时变量、原始字面量、Lambda 表达式都属于纯右值。

需要注意的是,字符串字面量只有在类中才是右值,当其位于普通函数中是左值。例如:

class Foo {
    const char*&& right = "this is a rvalue"; // 此处字符串字面量为右值

public:
    void bar() {
    right = "still rvalue"; // 此处字符串字面量为右值
}
};

int main() {
const char* const &left = "this is an lvalue"; // 此处字符串字面量为左值
}

将亡值 (xvalue, expiring value),是C++11 为了引入右值引用而提出的概念(因此在传统 C++
中,纯右值和右值是同一个概念),也就是即将被销毁、却能够被移动的值。

将亡值可能稍有些难以理解,我们来看这样的代码:

std::vector<int> foo() {
    std::vector<int> temp = {1, 2, 3, 4};
    return temp;
}
std::vector<int> v = foo();

标签:std,纯右值,右值,左值,C++,引用,字面
From: https://www.cnblogs.com/dyanblog/p/18262633

相关文章

  • dotnet 6 破坏性改动 仅引用程序集输出路径变更
    在dotnet5开始,可以设置ProduceReferenceAssembly为true让项目构建时输出仅引用程序集。仅引用程序集是仅导出项目的公开成员定义,而不包含具体的实现的代码逻辑。只用来被其他项目引用,体积很小,但不用来作为最终发布文件在此前的如下博客里面已经告诉大家如何创建仅引用程序......
  • vb.net c#一键编绎引用DLL如何做?编绎成独立EXE
    .netc#一键编绎引用如何做?3个工程有依懒关系ClassLibrary1,ClassLibrary2,MainProject(主工程)ClassLibrary2依赖ClassLibrary1,MainProject依赖前2个如何实现一键按顺序编绎,自动添加前面2个生成的DLL到主工程,并且设置为不复制到输出目录,"生成操作"属性选择"嵌入的资源"VSI......
  • Maven 官网 查找&下载 jar包 & pom引用
    问题描述在我们在开发过程中,经常遇到程序中需要引用的某个版本jar包,但是在公司的私有仓库下载不到的情况。遇到这种情况,该怎么办呢?很多人应该首选百度搜索吧。(当然可以,但是,不一定能很快找到自己想要的某个版本的jar包)这里给出一个简洁,方便查找的方案。 完美方案在Maven......
  • 【产品经理修炼之道】- 登录页怎么更好地吸引用户
    编辑导语:登录页对于一个网站来说十分重要,是用户对该网站的第一印象。本文作者分享了登录页更好地吸引用户的具体方法和思路,讲述了更好登录页文案的快捷方案和有效登录页文案的基本要素等,一起来学习一下吧。网站的开头都有个登录页。这往往是对公司的第一印象:是一个组织,它要......
  • Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的
    目录Elasticsearch聚合查询说明空值率查询DSLElasticsearch聚合基础知识扩展Elasticsearch聚合概念Script用法Elasticsearch聚合查询语法指标聚合(MetricAggregations)桶聚合(BucketAggregations)矩阵聚合(MatrixAggregations)组合聚合(PipelineAggregations)Elasticsearch聚合查询......
  • 浅谈 值类型和引用类型 在堆和栈中的存储
    浅谈值类型和引用类型在堆和栈中的存储简介本文将简单介绍什么是“栈”(stack)和“堆”(heap),并讨论值类型和引用类型在这两种内存结构中的存储方式。栈和堆的概念栈:后入先出(LIFO)的数据结构,由CLR管理,每个线程有自己的栈。堆:存放较为零散,由GarbageCollector(GC)管理,整个进程共......
  • Vue 3中的ref:深入理解响应式引用
    ......
  • C#面:请说说C#引用和对象?
    在C#中,引用和对象是两个重要的概念。引用是指向内存中对象的指针或者句柄。在C#中,所有的类都是引用类型,这意味着当我们创建一个类的实例时,实际上是在内存中分配了一块空间,并返回一个指向该空间的引用。通过引用,我们可以访问和操作对象的成员。对象是在内存中分配的一块空间,用......
  • JS 前端动态引用 js 、 css 文件
    JS前端动态引用js、css文件 letjsArrPath=['/web_config_other.js','/web_point.js']letcssArrPath=[]consthead=document.getElementsByTagName("head")[0];jsArrPath.forEach(jsPath=>{letscriptElement=document......
  • C++ 20新特性之原子引用
    ......