首页 > 编程语言 >C++ 左值和右值

C++ 左值和右值

时间:2024-09-16 09:24:22浏览次数:7  
标签:右值 int 绑定 左值 C++ 引用 表达式

一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值

我们不能将其绑定到要求转换的表达式、字面常量或是返回右值的表达式(参见 2.3.1节,第 46页)。右值引用有着完全相反的绑定特性:我们可以将一个右值引用绑定到这类表达式上,但不能将一个右值引用直接绑定到一个左值上:

int i = 42;             
int &r = i;            //正确:r引用i
int &&rr = i;          //错误:不能将一个右值引用绑定到一个左值上
int &r2 = i* 42;         //错误:i*42是一个右值
const int &r3 = i*42;    //正确:我们可以将一个const的引用绑定到一个右值上
int &&rr2 = i * 42;     //正确:将rr2 绑定到乘法结果上

返回左值引用的函数,连同赋值、下标、解引用和前置递增/递减运算符,都是返回左值的表达式的例子。我们可以将一个左值引用绑定到这类表达式的结果上。

返回非引用类型的函数,连同算术、关系、位以及后置递增/递减运算符,都生成右值。我们不能将一个左值引用绑定到这类表达式上,但我们可以将一个 const 的左值引用或者一个右值引用绑定到这类表达式上。

左值持久;右值短暂

考察左值和右值表达式的列表,两者相互区别之处就很明显了:左值有持久的状态而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象。由于右值引用只能绑定到临时对象,我们得知

  • 所引用的对象将要被销毁
  • 该对象没有其他用户

这两个特性意味着:使用右值引用的代码可以自由地接管所引用的对象的资源。

变量是左值

变量可以看作只有一个运算对象没有运算符的表达式,虽然我们很少这样看待变量。类似其他任何表达式,变量表达式也有左值/右值属性。变量表达式都是左值。带来的结果就是,我们不能将一个右值引用绑定到一个右值引用类型的变量上,这有些令人惊讶:

int &&rr1 = 42;      //正确:字面常量是右值
int &&rr2 = rrl;     //错误:表达式rr1 是左值!

其实有了右值表示临时对象这一观察结果,变量是左值这一特性并不令人惊讶。毕竟,变量是持久的,直至离开作用域时才被销毁。

// decltype 对变量加上(),返回左值引用。




《C++ Primer》 P471

标签:右值,int,绑定,左值,C++,引用,表达式
From: https://www.cnblogs.com/huvjie/p/18415966

相关文章

  • C++-练习-40
    题目:编写一个程序,她每次读取一个单词,知道用户只输入q。然后,该程序指出有多少个单词以元音大头,而多少个单词以辅音大头,还有多少个单词不属于着两类。源代码:#include<iostream>#include<cctype>//元音:A、E、I、O、Uintmain(){ usingnamespacestd; charword[20];......
  • 南沙C++信奥老师解一本通题:2110:【例5.1】素数环
    ​【题目描述】输入正整数n,把整数1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。【输入】输入正整数n。【输出】输出任意一个满足条件的环。【输入样例】6【输出样例】432561【提示】数据满足:4≤n≤30#include<bits/stdc++.h>usingnamespace......
  • 南沙C++信奥老师解一本通题 1228:书架
    ​ 【题目描述】John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。John共有NN头奶牛(1≤N≤20,000),每头奶牛有自己的高度Hi(1≤Hi≤10,000),N头奶牛的总高度为S。书架高度为B(1≤B≤S<2,000,000,007)。为了到达书架顶层,奶牛可以踩着其他奶牛的......
  • C++ 教程 #1
    目录1.IDE下载2.基础框架2.1头文件2.2命名空间2.3定义主函数2.4返回值3.变量与常量变(常)量类型表格3.1定义变量3.2定义常量3.3注意事项4.输入与输出4.1输入输出流4.2格式化输入输出5.作业5.1P1001A+BProblem5.2P5708【深基2.习2】三角形面......
  • 《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现
    摘要本文深入探讨了AVL树(自平衡二叉搜索树)的概念、特点以及实现细节。我们首先介绍了AVL树的基本原理,并详细分析了其四种旋转操作,包括左旋、右旋、左右双旋和右左双旋,阐述了它们在保持树平衡中的重要作用。接着,本文从头到尾详细描述了AVL树的插入、删除和查找操作,配......
  • C++入门 二(函数重载,引用,超详细!!!)
    文章目录函数重载函数重载的概念引用引用的概念引用特性函数重载函数重载的概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同......
  • 我与C++的爱恋:进程状态(RSDT 阻塞 僵尸 孤儿)
    ​​......
  • HUAWEI(Dev-C++手机版1.1)新加计算,计算崩溃
    #include<iostream>#include<string>#include<conio.h>//注意:这仅在Windows中有效#include<windows.h>#include<cstdlib>#include<ctime>#include<iomanip>//用于格式化时间输出usingnamespacestd;typedeflonglongll;int......
  • C++【全特化】【半特化】【继承方式权限】【继承使用】【菱形继承的探究】【组合与继
    目录类模板的特化全特化偏特化特化部分参数对参数类型进行一定的限制关于*&的讨论特化的优先级类模板的声明和定义分离​编辑继承初学继承概念理解继承方式继承权限继承切割与切片继承的作用域继承的默认构造成员函数继承的默认构造继承的拷贝构造继承的赋......
  • C++入门基础知识69(高级)——【关于C++ 动态内存】
    成长路上不孤单......