从《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++不允许修改任何基本型别(包括指针)的暂时值相关推荐

  1. C语言的变量和汇编中的伪指令,伪指令 尤其EQU DW DB(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪指令是在微机标准版基础上修改的版

    微机原理中表明 变量用伪指令DW,DB 单片机中的伪指令EQU C语言中的变量来源与汇编的伪指令(微机和单片机中的作用稍微不同,但是规则机制相同)微机原理中的汇编指令和伪指令是标准的,单片机的指令和伪 ...

  2. Oracle-1:的列操作(增加列,修改列,删除列),包括操作多列

    Oracle的列操作(增加列,修改列,删除列),包括操作多列 增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 ...

  3. ios 图片居中裁剪_iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)...

    iOS UIImageView 根据需求调整frame 1.图片的宽和高不相等,截取图片的中间部分,截取的部分Size明确 2.图片的宽度要等于其父视图的类的宽度,然后根据宽度计算高度,保证 图片不变 ...

  4. STM32 标准库3.5修改默认外部8M晶振为16M晶振

    ST官方标准库V3.5默认的外部晶振频率为8M,实际使用中外部晶振需要修改为16M: 经过实验,修改有效,具体的patch如下: 修改 HSE_VALUE 值 diff --git "a/L ...

  5. 三国杀新服务器修改的武将,强度削弱 三国杀新标准版五大武将修改

    北京2013年5月20日游卡桌游重量级产品<三国杀 2013 标准版>正式发售,本次改版官方积极汇总玩家提出的建设性意见,同时依据<三国杀Online>和线下测试的结果,重新制 ...

  6. SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)

    假设原来数据库名为db,附加数据库为db.mdf和db_log.ldf.需要改成dbt,及dbt.mdf和dbt_log.ldf. 步骤: 1.首先把原来的数据库进行备份(选择数据库->右键-& ...

  7. SQL server 2005 如何批量修改架构名(包括表名和存储过程名) .

    SQL Server2005可以使用系统存储过程sp_changeobjectowner更改数据库对象的所有者. sp_changeobjectowner 用于更改当前数据库中对象的所有者. sp_c ...

  8. CE修改器入门:寻找指针基址

    上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针. 在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个 ...

  9. SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)

    刚开始学习SQL SERVER 2005,弄了一个上午修改数据库名,主要是需要修改db.mdf 和db_log.ldf的名字,总算解决了.在这里记下,以后再要修改了就别忘了. 假设原来数据库名为db, ...

最新文章

  1. PyTorch Tricks 集锦
  2. 使用OpenCV实现道路车辆计数
  3. iOS一个类可以关联多个nib文件
  4. Java中的字符串驻留
  5. Coreseek-带中文分词的Sphinx
  6. ubuntu下载工具aria2 uGet
  7. 银行加息前存的定期会随着加息吗?
  8. Silverlight学习笔记(九)-----RenderTransform特效【五种基本变换】及【矩阵变换MatrixTransform】...
  9. 链栈的入栈和出栈代码_代码简介:全栈开发仍然有效
  10. vim 删除,复制和粘贴
  11. Linux内核之数据双链表
  12. JBoss 系列三十七:jBPM5示例之 Rule Task
  13. Asp.Net IIS 管理类(全)
  14. HTTP Content-type整理
  15. Java 线程池(ThreadPoolExecutor)原理解析
  16. NYOJ234吃土豆(双层动态规划)
  17. MMORPG端游《ELYON》12月10日上线 采用买断式收费方式
  18. 大都会高端酒店推出迪拜目前最昂贵的豪华顶楼
  19. JAVA swing实现简单增删改查
  20. html5鼠标悬停图片放大的原理,jQuery当鼠标悬停时放大图片的效果实例

热门文章

  1. 解决maltab的中文和英文字体问题,中文乱码
  2. 1.1 基本图像导入、处理和导出
  3. Java数组的基本操作方法整理
  4. Kth Largest Element in an Array
  5. C++ Vector用法深入剖析
  6. hikaripool连接保持_springboot2的hikari数据库连接池默认配置
  7. flask-bootstrap-高亮-下划线-删除线-加粗-斜体
  8. 团队软件开发第一次冲刺(二)
  9. Pycharm 社区版本Database Navigator 安装教程
  10. hdu 2031 进制转换