值类别 左值引用 右值引用

2023-11-06

值类别

每个 C++ 表达式(运算符带上其操作数、字面量、变量名等)可按照两种独立的性质加以辨别:类型和值类别 (value category)。每个表达式都具有某种非引用类型,且每个表达式恰属于三种基本值类别之一:纯右值 (prvalue)、亡值 (xvalue)、左值 (lvalue),定义如下:

  • 泛左值 (glvalue)(“泛化 (generalized)”的左值)是其求值确定一个对象、位域或函数的个体的表达式;
  • 纯右值 (prvalue)(“纯 (pure)”的右值)是求值符合下列之一的表达式:
    • 计算某个运算符的操作数的值(这种纯右值没有结果对象),或者
    • 初始化某个对象或位域(称这种纯右值有一个结果对象)。所有类和数组的纯右值都有结果对象,即使它被舍弃也是如此。在某些语境中,将发生临时量实质化,以创建作为其结果对象的临时量;
  • 亡值 (xvalue)(“将亡 (expiring)”的值)是代表其资源能够被重新使用的对象或位域的泛左值;
  • 左值 (lvalue)(如此称呼的历史原因是,左值可以出现于赋值表达式的左边)是非亡值的泛左值;
  • 右值 (rvalue)(如此称呼的历史原因是,右值可以出现于赋值表达式的右边)是纯右值或者亡值。

关系图

Lvalues 和 Rvalues (C++)

expression 表达式
glvalue 泛左值
rvalue 右值
lvalue 左值
xvalue 亡值
prvalue 纯右值

示例

以下示例演示左值和右值的多种正确的和错误的用法:

// lvalues_and_rvalues2.cpp
int main()
{
    int i, j, *p;

    // Correct usage: the variable i is an lvalue and the literal 7 is a prvalue.
    // 用法正确:变量i是左值 ,文本7是纯右值 。
    i = 7;

    // Incorrect usage: The left operand must be an lvalue (C2106).`j * 4` is a prvalue.
    // 用法不正确:左操作数必须是左值(C2106)。'j*4'是纯右值。
    7 = i; // C2106
    j * 4 = 7; // C2106

    // Correct usage: the dereferenced pointer is an lvalue.
    // 用法正确:未引用的指针是左值。
    *p = i;

    // Correct usage: the conditional operator returns an lvalue.
    // 用法正确:条件运算符返回左值。
    ((i < 3) ? i : j) = 7;
    
    // Incorrect usage: the constant ci is a non-modifiable lvalue (C3892).
    // 用法错误:常量ci是不可修改的左值(c3892)。
    const int ci = 7;
    ci = 9; // C3892
}

左值引用声明符: &

保留对象的地址,但行为方式在语法上与对象相似。

语法

type-id & cast-expression

示例

以下示例通过声明 Person 对象和对该对象的引用演示了引用声明符。 由于 rFriend 是对 myFriend 的引用,因此更新任一变量都将更改同一对象。

int main()
{
	// 正确:i是左值,x是左值引用
	int i = 10;
	int& x = i;
	cout << "i:" << i << " x:" << x << endl;
	i = 20;
	x = 30;
	cout << "i:" << i << " x:" << x << endl;

	// 错误:非常量引用的初始值必须为左值
	//int& x = 10; // 10是右值

	// 正确
	const int& c = 10;
}
Output
i:10 x:10
i:30 x:30

反汇编

	int i = 10;
00BE5DB2  mov         dword ptr [i],0Ah  
	int& x = i;
00BE5DB9  lea         eax,[i]  
	int& x = i;
00BE5DBC  mov         dword ptr [x],eax  

	i = 20;
00BE5E22  mov         dword ptr [i],14h  
	x = 30;
00BE5E29  mov         eax,dword ptr [x]  
00BE5E2C  mov         dword ptr [eax],1Eh  

伪代码

int main()
{
	int i = 10;
	int* x = &i;
	cout << "i:" << i << " x:" << *x << endl;
	i = 20;
	*x = 30;
	cout << "i:" << i << " x:" << *x << endl;
}

右值引用声明符: &&

保留对右值表达式的引用。

语法

type-id && cast-expression

示例

#include <iostream>

using namespace std;

int main()
{
	// 错误:无法将右值引用绑定到左值
	//int i = 10; // i是左值
	//int&& x = i;

	// 正确
	int&& x = 10;
	cout << "x:" << x << endl;
	x = 20;
	cout << "x:" << x << endl;
}
Output
x:10
x:20

反汇编

	int&& x = 10;
00DA5DB2  mov         dword ptr [ebp-18h],0Ah  
00DA5DB9  lea         eax,[ebp-18h]  
00DA5DBC  mov         dword ptr [x],eax  

	x = 20;
00DA5E00  mov         eax,dword ptr [x]  
00DA5E03  mov         dword ptr [eax],14h  

伪代码

int main()
{
	int temp = 10;
	int* x = &temp;
	cout << "x:" << *x << endl;

	*x = 20;
	cout << "x:" << *x << endl;
}

相关参考

微软文档(左值和右值)

微软文档(左值引用)

微软文档(右值引用)

cppreference

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

值类别 左值引用 右值引用 的相关文章

  • 关于多层感知机(MLP)你必须知道的20个知识点

    问题1 MLP的基本组成单元是什么 答 MLP的基本组成单元是神经元 neuron 它通过激活函数对输入进行加权求和和非线性变换 问题2 MLP通常有几层 答 MLP通常有输入层 隐藏层和输出层 隐藏层可以有一层或多层 问题3 MLP的训练
  • 配置ntp客户端与服务器端时间的同步

    1 实验机器介绍 Ip地址 服务器1 192 168 245 128 服务器2 192 168 245 130 客户端1 192 168 245 129 实验前准备 在ntpS1 和ntpS2 中 配置外部服务器为同步服务器 并开放给192
  • 前端内存泄漏和溢出的情况以及解决办法

    写在前面 在平时写代码时 内存泄漏的情况会时有发生 虽然js有内存回收机制 但在平时编程中还是需要注意避免内存泄漏的情况 前几天做移动端时遇到一个内存泄漏造成移动端页面卡顿的问题 所以想总结下前端内存泄漏的情况 回顾下基础知识 一 什么是内
  • RPM 的 spec 文件如何编写

    在关于 RPM 软件包构建的上一篇文章中 你了解到了源 RPM 包括软件的源代码以及 spec 文件 这篇文章深入研究了 spec 文件 该文件中包含了有关如何构建 RPM 的指令 同样 本文以 fpaste 为例 了解源代码 在开始编写
  • 全球及中国汽车用导航行业应用前景与销售渠道分析报告2022-2028年

    全球及中国汽车用导航行业应用前景与销售渠道分析报告2022 2028年 修订日期 2022年1月 专员对接 周文文 查询鸿晟信合研究院了解详细内容 第一章 汽车用导航产业概述 1 1 汽车用导航定义及产品技术参数 1 2 汽车用导航分类 1
  • Idea:修改新项目默认设置

    修改Idea新项目默认设置 使用idea开发时 即使在settings设置项目配置 如maven 在新建项目也会发现项目配置变为默认 这时需要设置新建项目配置 配置步骤 File New Projects Setup Settings fo
  • Log4j 配置文件(log4j.properties)的所在路径问题

    一般我们直接将log4j properties放置在src目录下 这样系统自动会找到的 其实就是放在WEB INF classes文件下 这个路径在classpath下 所以直接就能找到 我们写Logger的时候如下 public clas
  • Servlet配置、会话管理——Servlet【总结】

    Servlet配置 初始化参数 Servlet除了可以从请求信息中获取信息外 还可以从配置文件中获取配置参数信息 配置文件中的参数信息与具体的请求无关 而是Servlet初始化时调用的 如此可以避免硬编码信息 提高Servlet的可移植性
  • 创建的源文件后缀不是.c,在一些编译器上不能编译

    问题描述 源文件的名字和后缀写的比较随意 后缀不是 c 代码没有语法高亮 可能在一些编译器上不能编译通过 现象 解决办法 C语言代码中我们有约定 源文件的后缀是 c 头文件的后缀是 h 这样在大部分的IDE中代码打开都是有语法高亮的
  • 想学软件开发做程序员,学习Python必备的Python从入门到精通约650GB全面学习资料

    先简单介绍一下Python的情况 后面文章最后附有零基础自学Python从入门到精通学习Python的视频文档源码低阶到高阶等全面学习资料约650GB 1 什么是PythonPython 是一个有条理的和强大的面向对象的程序设计语言 类似于
  • 使用 Selenium 和 Python 爬取股票网站历史资金数据的简易教程

    一 需求及技术介绍 在金融投资领域 了解股票市场的历史资金数据对于制定投资策略和做出明智的决策至关重要 这些数据包含着股票的交易量 资金流向 持股比例等关键指标 能够为投资者提供有价值的参考和分析依据 通过利用 Selenium 模拟浏览器
  • Debug-CDK编译

    问题描述 make No rule to make target xxx c needed by Obj xxx o Stop 解决方法 删掉obj文件夹 重新编译
  • 【网络基础】通俗易懂的了解HTTPS的整体过程

    文章目录 前言 HTTP 各个版本 结构 请求 请求行 请求头 请求体 响应 响应行 响应头 响应体 HTTPS 对称加密 非对称加密 对称和非对称结合加密 CA证书中级大发 证书 对称和非对称结合加密 证书关系链 拓展知识 证书的合法性验
  • STM32的常规芯片容量大小以及 大、小容量STM32芯片之间的差别?

    本文主要讨论STM32的常规芯片容量大小以及 STM32芯片大 小容量之间的差别 STM32大容量芯片是包括高达512K字节的闪存和64K字节的SRAM的芯片为大容量 STM32小容量芯片具体容量见下表 STM32F103xC STM32F
  • nginx+tomcat集群+https

    nginx tomcat集群 一 nginx安装 1 安装nginx需要的依赖包 yum y install gcc zlib zlib devel pcre devel openssl openssl devel 2 下载nginx安装包

随机推荐

  • (附源码)ssm考试题库管理系统 毕业设计 069043

    SSM考试题库管理系统 摘 要 随着计算机办公自动化程度的不断提高 开发各种数据库管理应用软件用于各种工作中能有效地提高工作效率 节省时间 能使学校的教学工作上一个新的台阶 传统的人工命题形成试卷 往往会出现大量的重复劳动 并且形成的试卷因
  • FTP局域网内文件共享

    FTP局域网内文件共享 由于最近公司电脑主机不让插U盘拷贝数据 所以导致在打包软件进行上机测试的时候需要使用聊天软件来进行传输 相对比较麻烦 所以决定使用FTP在局域网内来进行文件的共享 记录一下 一起学习吧 操作步骤目录 共享文件夹设置
  • c++ 内存管理一:初识内存分配工具

    文章目录 前言 1 new 和 delete 2 new 和delete 3 operator new 4 placement new 5 malloc和free 6 allocator 前言 侯捷 c 内存管理学习总结笔记 在C 中 有几
  • win服务器文件复制命令,用命令形式从Windows系统拷贝文件到Linux

    1 将本机文件复制到远程服务器上 scp home administrator news txt root 192 168 6 129 etc squid home administrator 本地文件的绝对路径 news txt 要复制到
  • 452. 用最少数量的箭引爆气球

    452 用最少数量的箭引爆气球 在二维空间中有许多球形的气球 对于每个气球 提供的输入是水平方向上 气球直径的开始和结束坐标 由于它是水平的 所以纵坐标并不重要 因此只要知道开始和结束的横坐标就足够了 开始坐标总是小于结束坐标 一支弓箭可以
  • 自动控制原理实验二 二阶系统阶跃响应

    实验源码已经上传CSDN了 需要的可直接下载 链接 https download csdn net download weixin 53129688 87694703 实验内容 其中 z 和wn对系统的动态品质有决定的影响 z为阻尼比 由于
  • 电子书 杜春雷 ARM体系结构与编程

    https pan baidu com s 1AYpTxklTRXCpqGV6hD3UzQ 提取码 j7ku
  • IO流概念与open函数操作

    IO流 input output stream 存储设备 磁盘 rom 能永久保存 读取写入速度慢 内存 ram 读取速度快 不能永久保存 断电就没了 贵 狭义 CPU运算 暂时写入内存 没读满就不存进去 见file 再存入磁盘保存 广义
  • STM32的RTC使用

    STM32的RTC使用 初始化RTC 设置时间保存时间 获取实时时间 RTC后备区另类使用 初始化RTC define RTC SET CONFIG FLAG 0x6066 lt RTC设置完成标志 判断是否第一次配置 if HAL RTC
  • 自动化运维工具Ansible基础部署与使用

    目录 一 安装部署 二 配置 Ansible最基础的模块为ping模块 主要用于判断远程客户端是否在线 用于ping本身服务器 返回值为changed ping 三 ansible批量管理 shell模块 copy模块 yum模块 file
  • MATLAB中peaks函数的用法

    MATLAB中peaks函数感觉比较有意思 是两个变量的样本函数 用法主要为 z peaks 返回一个49 49的矩阵 z peaks n 返回一个n n的矩阵 peaks n 没有输出参数时 这个函数直接使用surf来绘制peaks 默认
  • sklearn之feature_importance_参数的学习

    一 随机森林 原文链接 https blog csdn net zjuPeco article details 77371645 随机森林的算法可以用如下几个步骤概括 用有抽样放回的方法 bootstrap 从样本集中选取n个样本作为一个训
  • PBR 与 OpenGL ES 2.0 中的LOD纹理:Mipmap (关于Lod和Bias)

    MipMap 当使用Mipmap的时候可能会用到xxxLod 和 xxxBias 这几种纹理采样函数 在片段着色器中 vec4 texture2D sampler2D sampler vec2 coord vec4 textureCube
  • 对抗js前端加密的万能方法

    1 前言 现在越来越多的网站采用全报文加密 测试的时候需要逆向提取加密算法以及密钥 过程十分繁琐和复杂 本文提供一种更为简单快捷的方法来解决此问题 原理大致如下 使用浏览器的Override Hook加密前的数据 配置代理地址发送给中转服务
  • LC滤波器简单设计法 - 一文读懂LC滤波器简单设计方法及原理介绍,LC值计算方法

    LC滤波器简单设计法 一文读懂LC滤波器简单设计方法及原理介绍 LC值计算方法 LC滤波器概述 LC滤波器也称为无源滤波器 是传统的谐波补偿装置 LC滤波器之所以称为无源滤波器 顾名思义 就是该装置不需要额外提供电源 LC滤波器一般是由滤波
  • 【Python进阶学习】根据数据绘制省份热力地图(源码)

    输入 pro sales csv 省份与值 数据 province 省份列 deal 值列 输出 中国地图 html 优化 显示省份名称 使用notepad 打开中国地图 html 搜索 series 在1900多行这个 3 增加以下内容
  • mybatis utf8mb4 java_java.sql.SQLException: Unsupported character encoding 'utf8mb4'.

    四月 12 2017 3 47 52 下午 org apache catalina core StandardWrapperValve invoke 严重 Servlet service for servlet SpringMVC in c
  • 深度学习拾遗

    深度学习 hinton bp算法 李飞飞 吴恩达 黄广斌 路奇 深度学习优化的超参数 1 学习率 学习率 learning rate或作lr 是指在优化算法中更新网络权重的幅度大小 学习率可以是恒定的 逐渐降低的 基于动量的或者是自适应的
  • 面向高维优化问题的混沌粒子群混合蝴蝶优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码及详细文章讲解 4 参考文献 1 概述 文献来源 摘要 为了解决蝶形优化
  • 值类别 左值引用 右值引用

    文章目录 值类别 关系图 示例 左值引用声明符 语法 示例 反汇编 伪代码 右值引用声明符 语法 示例 反汇编 伪代码 相关参考 值类别 每个 C 表达式 运算符带上其操作数 字面量 变量名等 可按照两种独立的性质加以辨别 类型和值类别 v