C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
从《C++标准库》一书中看到这样一句话:C++不允许修改任何基本型别(包括指针)的暂时值,想了半天,实在不理解。基本类型char,int,float等等还有暂时值?例如int a=2,那么这个a的暂时值是哪个呢?我能不能把2理解为a的暂时值?如果2为暂时值,显然不行,因为你根本无法修改2,那么那句话就毫无意义了。暂时值先不管了,不知道怎么找,搜了很多,明白一个大概意思,先看几个从网上找到的例子:
#include<iostream> using namespace std; void main() {int a = 4;a++ = 5;int *b;*b = 4;*b++ = 5; }
a++;
后缀++ 返回的是一个(临时的)右值,其值是a的原值, 不能被赋值。(注意,这里说的是右值)
*b++ = 5;
该表达式是 *(b++) = 5;
也就是先对指针加1, 再解引用。
b++ 同a++一样, 是一个临时的右值,(其值是b的原值), 不能被赋值, 比如下面的代码不合法:
b++ = ptr;
b++表达式产生的是一个临时的指针值, 对指针解引用(当然,该值必须指向合法位置)之后, 就是一个左值了,所以:
*b++ = 5; 就是合法的。
再看一个例子;
#include <iostream> using namespace std; class my {public:my(int j=0):i(j){}int i;void operator=(my&out)//这里重定义一个赋值操作符=,为下面的赋值做准备。 {i=out.i;} }; my fun() {my temp(1);return temp;//这里返回一个类的临时变量 } int fun2() {int a;return a;//这里返回一个普通int临时变量 } int main() { my out(2);fun()=out; //这里可以对类的临时变量赋值fun2()=3; //但是这里对普通int类型的变量就会出错 }
fun2()返回的是一个右值,不能赋值,只能这么解释了。
再看《C++标准库》提到的问题:
vector<int> coll; ..... sort(++coll.begin(),coll.end());
书上说会编译失败。我在VS2012下面编译却没有问题。
记住一点:右值不能被修改。
转载于:https://www.cnblogs.com/VIPler/p/4319103.html
C++标准:C++不允许修改任何基本型别(包括指针)的暂时值相关推荐
- C语言的变量和汇编中的伪指令,伪指令 尤其EQU DW DB(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪指令是在微机标准版基础上修改的版
微机原理中表明 变量用伪指令DW,DB 单片机中的伪指令EQU C语言中的变量来源与汇编的伪指令(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪 ...
- Oracle-1:的列操作(增加列,修改列,删除列),包括操作多列
Oracle的列操作(增加列,修改列,删除列),包括操作多列 增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 ...
- ios 图片居中裁剪_iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)...
iOS UIImageView 根据需求调整frame 1.图片的宽和高不相等,截取图片的中间部分,截取的部分Size明确 2.图片的宽度要等于其父视图的类的宽度,然后根据宽度计算高度,保证 图片不变 ...
- STM32 标准库3.5修改默认外部8M晶振为16M晶振
ST官方标准库V3.5默认的外部晶振频率为8M,实际使用中外部晶振需要修改为16M: 经过实验,修改有效,具体的patch如下: 修改 HSE_VALUE 值 diff --git "a/L ...
- 三国杀新服务器修改的武将,强度削弱 三国杀新标准版五大武将修改
北京2013年5月20日游卡桌游重量级产品<三国杀 2013 标准版>正式发售,本次改版官方积极汇总玩家提出的建设性意见,同时依据<三国杀Online>和线下测试的结果,重新制 ...
- SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)
假设原来数据库名为db,附加数据库为db.mdf和db_log.ldf.需要改成dbt,及dbt.mdf和dbt_log.ldf. 步骤: 1.首先把原来的数据库进行备份(选择数据库->右键-& ...
- SQL server 2005 如何批量修改架构名(包括表名和存储过程名) .
SQL Server2005可以使用系统存储过程sp_changeobjectowner更改数据库对象的所有者. sp_changeobjectowner 用于更改当前数据库中对象的所有者. sp_c ...
- CE修改器入门:寻找指针基址
上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针. 在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个 ...
- SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)
刚开始学习SQL SERVER 2005,弄了一个上午修改数据库名,主要是需要修改db.mdf 和db_log.ldf的名字,总算解决了.在这里记下,以后再要修改了就别忘了. 假设原来数据库名为db, ...
最新文章
- PyTorch Tricks 集锦
- 使用OpenCV实现道路车辆计数
- iOS一个类可以关联多个nib文件
- Java中的字符串驻留
- Coreseek-带中文分词的Sphinx
- ubuntu下载工具aria2 uGet
- 银行加息前存的定期会随着加息吗?
- Silverlight学习笔记(九)-----RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】...
- 链栈的入栈和出栈代码_代码简介:全栈开发仍然有效
- vim 删除,复制和粘贴
- Linux内核之数据双链表
- JBoss 系列三十七:jBPM5示例之 Rule Task
- Asp.Net IIS 管理类(全)
- HTTP Content-type整理
- Java 线程池(ThreadPoolExecutor)原理解析
- NYOJ234吃土豆(双层动态规划)
- MMORPG端游《ELYON》12月10日上线 采用买断式收费方式
- 大都会高端酒店推出迪拜目前最昂贵的豪华顶楼
- JAVA swing实现简单增删改查
- html5鼠标悬停图片放大的原理,jQuery当鼠标悬停时放大图片的效果实例