首页 > 编程语言 >C++ 左值于右值的理解

C++ 左值于右值的理解

时间:2022-08-29 21:13:39浏览次数:71  
标签:std const string 右值 int 左值 C++

定义与区别

左值 (lvalue, locator value) 表示了一个占据内存中某个可识别的位置(也就是一个地址)的对象。即左值指的是可以取地址的变量。

区分表达式的左右值属性有一个简便方法:若可对表达式用 & 符取址,则为左值,否则为右值。 左值与右值的根本区别在于能否获取内存地址,而能否赋值不是区分的依据。

const int a = 10; // 'a' 是左值
a = 10;           // 但不可以赋值给它!

左值与右值直接的转换

一般上讲,对象之间的运算,对象是以右值的形式参与的。表示数组、函数和非完整类型的左值是不能转换为右值的,因为无法对那些类型进行求值。

int a = 1;     // a 是左值
int b = 2;     // b 是左值
int c = a + b; // a和b自动转换为右值求和

右值可以通过一些更显式的方法产生左值。例如,一元解引用操作符 *需要一个右值参数,但返回一个左值结果。

int arr[] = {1, 2};
int* p = &arr[0];
*(p + 1) = 10;   // 正确: p + 1 是右值,但 *(p + 1) 是左值

相反地,一元取地址操作符 '&' 需要一个左值参数,返回一个右值:

int var = 10;
int* bad_addr = &(var + 1); // 错误: 一元 '&' 操作符需要左值参数
int* addr = &var;           // 正确: var 是左值
&var = 40;                  // 错误: 赋值操作的左操作数需要是左值

左值引用

C++中可以使用&符定义引用,如果一个左值同时是引用,就称为“左值引用”。

std::string s;
std::string& sref = s;  //sref为左值引用

非const左值引用 不能使用右值对其赋值。但 const左值引用 可以。

【解析】非const引用类型的变量是可以后续对其进行赋值操作的,但是右值是不可获取内存地址。但const左值引用不一样,因为常量不能被修改,也就不存在上述问题。

std::string& r = std::string(); //错误!std::string()产生一个临时对象,为右值
const std::string& r = std::string(); //可以

因此,我们经常使用const左值引用作为函数的参数类型,可以减少不必要的对象复制。

转载:https://www.cnblogs.com/jakelin/p/15603548.html

标签:std,const,string,右值,int,左值,C++
From: https://www.cnblogs.com/happinesspills/p/16637365.html

相关文章

  • CCF 202009-1 称检测点查询(C++)
    使用结构体struct+自定义sort轻松搞定#include<iostream>#include<bits/stdc++.h>#include<cstdio>usingnamespacestd;intn,X,Y;structpoint{......
  • C++【多线程编程】之【线程安全】
    1.线程安全是什么?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。2.什么情况......
  • C++各个版本新增对于算法竞赛有用特性
    C++各个版本新增对于算法有用特性C++11auto与decltype类型推导(摘自程序喵大人)autoauto可以让编译器在编译器就推导出变量的类型,话不多说上代码:autoa=10;//10是in......
  • c++ 在项目中创建DLL,并调用
    创建DLL分为两种方法,先介绍第一种一、创建DLL(1)//dll.h#pragmaonce//dll.h#ifndefDLL_H_#defineDLL_H_voidprinthello();voidcallPython();extern"C"_de......
  • C++ 多维数组的访问
    1.可以把一维数组想象成一排士兵,把二维数组想象成一个士兵方阵,把三维数组想象成多个士兵方阵。这样,当你要找其中的一个士兵时,你只要知道他在哪个方阵(从0、1、2中选择),在哪......
  • C/C++全国交通咨询模拟系统
    C/C++全国交通咨询模拟系统全国交通咨询模拟【问题描述】处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客......
  • C++【多线程编程】之【初识线程创建】
    1.线程创建函数调用pthread_create(句柄、参数、函数入口,函数入口的实参)intpthread_create(....)cppthread类:thread类的创建方法比较简便。但也有很多问题需要考虑......
  • 【c++】线程同步改错题 (互斥体)
     题目:#include<iostream>#include<windows.h>#include<tchar.h>//我想使用线程,让线程按我制定?的方案执行,但是总失败//起床-》吃饭-》工作-》回家-》起床HA......
  • ERROR: <bits/stdc++.h>, 'cstdalign' file not found, running C++17
    Modified 1year,1monthagoViewed 9ktimes4I'mtryingtorunapieceofcodein VisualStudioCode,onmacOSCatalina.Thecode:#include<bi......
  • c++学习案例:猜数字游戏
    最近在学习C++,遇到了一个案例:猜数字游戏案例要求:系统生成一个范围在1-100的随机整数,用户有5次猜数字的机会,当用户猜的数字大于或小于生成的值时进行提示,5次没猜对则失败,......