c/c++左值和右值
C/C++中的变量有左值和右值之分,他们的区别主要如下:
(1)左值可以放在赋值号 = 的左右两边,右值只能放在赋值号 = 的右边
(2)在C语言中,有名字的变量即为左值;而函数的运行结果或表达式中间变量即为右值
(3)对于内嵌类型(基本类型,即built-in types),右值是不可以被更改的,也不可以被const,volatile所修饰;
对于自定义类型,右值却可以通过它的成员函数来进行修改。
(4)左值也可以作为右值表达式,变量可以是左值,也可以为右值,但常量只能是右值。
(5)右值只能被const 类型的引用所指向;而左值可以被const或非const类型引用指向
在 c++ 中,每一个表达式都会产生一个左值,或者右值,相应的,该表达式也就被称作“左值表达式”,“右值表达式”。
例如:
++a 为将a进行自加,然后返回a,a本身就有内存地址,为一个左值,因此 (++a)++ 正确;
而 a++是后自增,在表达式里的值仍然为原来的a,返回a,然后a再被赋值为a+1。而返回的值为一个临时变量,是一个右值,不能被改变,不存在内存地址。所以(a++)++错误。
//左值只能为变量,不能是常量,因为常量不能放在赋值号左边;但右值可以是变量或常量,因为常量和变量都可以放在赋值号右边。
#include<iostream>
using namespace std;
template<typename T>
class ReferenceWrapper{
public:
explicit ReferenceWrapper(T& t) :
t_(&t){};
operator T&() const{
return *t_;
} T& Get() const{
return *t_;
}
T* GetPointer() const{
return t_;
}
void Print(){
cout << *t_ << endl;
}
private:
T* t_;
}; template<typename T>
ReferenceWrapper<T> GetRW(){
static T t = 0;
return ReferenceWrapper<T>(t++);
} int Func(){
static int a = 0;
return a++;
}
int main(){
int value = 10;
ReferenceWrapper<int> rw(value); //构造函数
cout << rw + 100 << endl;
int value1 = 100 + value; rw = ReferenceWrapper<int>(value1); //赋值号,进行构造 value = rw; //调用 T& operator() 进行隐式转换,将对象转换为 int类型 rw.Get() = value; //返回T&, 可以进行赋值操作
*rw.GetPointer() = value; //返回 T*,然后进行赋值 (int&)rw = value; //将rw隐式转换为 T&,这时候为右值;需要进行(int&)显示转换来进行赋值操作 // rw = value; //出错, T& operator() 函数进行隐式转换,只能作为右值,不能作为左值 //函数返回一个自定义类型的变量,为右值
//但是对于自定义类型,右值可以调用类的成员函数,即 operator = ,则可以放在=左边
GetRW<int>() = ReferenceWrapper<int>(value1); //函数返回一个内嵌类型的变量,该变量为右值。不能放在=左边
Func() = 100; //右值调用类内部的成员函数
GetRW<int>().Print(); //Func 函数返回一个临时变量,为右值
//右值可以调用成员函数,只能被const 类型的引用所指向。
const int & tmp1 = Func();
int & tmp2 = Func(); //左值既可以被const也可以被非const类型的引用所指向
int a = Func();
const int& tmp3 = a;
int& tmp4 = a; return 0;
}
c/c++左值和右值的更多相关文章
- c++左值和右值
c++编程中如果出现把一个函数的返回值.强行转化后的对象 作为函数的参数传进去时,编译器会报错的情况.这时候就该注意了,你需要把该函数的参数类型前加上const修饰. 原因在于c++的左值和右值有所区 ...
- c++ 左值 和 右值
什么是lvalue, 什么是rvalue? lvalue: 具有存储性质的对象,即lvalue对象,是指要实际占用内存空间.有内存地址的那些实体对象,例如:变量(variables).函数.函数指针等 ...
- C++中的左值与右值(二)
以前以为自己把左值和右值已经弄清楚了,果然发现自己还是太年轻了,下面的这些东西是自己通过在网上拾人牙慧,加上自己的理解写的. 1. 2. 怎么区分左值和右值:知乎大神@顾露的回答. 3. 我们不能直接 ...
- C++中的左值和右值
左值和右值的定义 在C++中,能够放到赋值操作符=左边的是左值,能够放到赋值操作符右边的是右值.有些变量既能够当左值又能够当右值.进一步来讲,左值为Lvalue,事实上L代表Location,表示在内 ...
- C++11 左值与右值
概念 左值:表达式结束后依然存在的对象 右值:表达式结束后就不存在的临时对象 2.如何判断左值和右值 能不能对表达式取地址,如果能,就是左值,否则就是右值 3.对下面的语句进行区分 int a = 3 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward
这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运行测试过的,希望能用这些帮助理 ...
- C++11 左值、右值、右值引用详解
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...
- C++11 左值、右值、右值引用
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个 ...
- C++ 左值与右值 右值引用 引用折叠 => 完美转发
左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. ...
随机推荐
- 二叉树、红黑树、伸展树、B树、B+树
好多树啊,程序猿砍树记,吼吼. 许多程序要解决的关键问题是:快速定位特定排序项的能力. 第一类:散列 第二类:字符串查找 第三类:树算法 树算法可以在辅助存储器中存储大量的数据. 二叉树.红黑树和伸展 ...
- linux 共享内存shm_open实现进程间大数据交互
linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...
- ubuntu开启sshd服务(转)
SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudo apt-ge ...
- 常用的百度API地图操作
常用的百度API地图操作,包括模糊搜索,放大缩小,并支持移动端 效果图如下 完整代码: http://download.csdn.net/detail/jine515073/8778167
- 服务器不装Excel读取Excel并转换DataTable
原来是用OleDb.4.0组件读取Excel,但是放到服务器后 傻了,服务器没装Excel ,而且领导说不可以装 没办法,只好自己重新找下代码 在CodeProject找到一个开源的dll,一阵欢喜啊 ...
- HTTP API 设计指南(基础部分)
前言 这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引. 这篇指南除了详细介绍现有的 API 外 ...
- r语言 技巧总结
1.table函数返回众数,再转为dataframe as.data.frame(table(x)) 2.使用which 返回数组下标 which(rs.list=="rs1008507&q ...
- css -- 通俗理解inline、block、inline-block
display:inline; 内联元素,简单来说就是在同一行显示. display:block; 块级元素,简单来说就是就是有换行,会换到第二行. display:inline-block; 就是在 ...
- Sublime Text 3安装清爽主题(著名的Soda Theme)
Sublime Text是一款强大的编辑器,不但拥有众多强大的功能,还拥有很多漂亮的主题以及大量的插件可供配置使用. 本文主要描述Sublime Text 3安装清爽的主题,默认的深色主题Monoka ...
- wd mycloud nas新玩法
最近家里的小米路由器坏了,主要是硬盘读取不出,小米之家也无能为力,本想继续在小米之家买个小米路由器,后来了解到了nas,于是想折腾下.我的nas型号是wd mycloud,3TB内置硬盘.功能:可以组 ...