C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
从《C++标准库》一书中看到这样一句话:C++不允许修改任何基本型别(包括指针)的暂时值,想了半天,实在不理解。基本类型char,int,float等等还有暂时值?例如int a=2,那么这个a的暂时值是哪个呢?我能不能把2理解为a的暂时值?如果2为暂时值,显然不行,因为你根本无法修改2,那么那句话就毫无意义了。暂时值先不管了,不知道怎么找,搜了很多,明白一个大概意思,先看几个从网上找到的例子:
#include<iostream>
using namespace std;
void main()
{
int a = ;
a++ = ; int *b;
*b = ;
*b++ = ;
}
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=):i(j){}
int i;
void operator=(my&out)//这里重定义一个赋值操作符=,为下面的赋值做准备。
{
i=out.i;
}
};
my fun()
{
my temp();
return temp;//这里返回一个类的临时变量
}
int fun2()
{
int a;
return a;//这里返回一个普通int临时变量 }
int main()
{
my out();
fun()=out; //这里可以对类的临时变量赋值
fun2()=; //但是这里对普通int类型的变量就会出错
}
fun2()返回的是一个右值,不能赋值,只能这么解释了。
再看《C++标准库》提到的问题:
vector<int> coll;
.....
sort(++coll.begin(),coll.end());
书上说会编译失败。我在VS2012下面编译却没有问题。
记住一点:右值不能被修改。
C++标准:C++不允许修改任何基本型别(包括指针)的暂时值的更多相关文章
- ORA-01440:要减小精度和标准,则要修改的列必须为空
修改字段的精度时,提示“ ORA-01440:要减小精度和标准,则要修改的列必须为空 ” 解决方法:将该表中的数据全部删除即可
- STM32 标准库3.5修改默认外部8M晶振为16M晶振
ST官方标准库V3.5默认的外部晶振频率为8M,实际使用中外部晶振需要修改为16M: 经过实验,修改有效,具体的patch如下: 修改 HSE_VALUE 值 diff --git "a/L ...
- SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)
刚开始学习SQL SERVER 2005,弄了一个上午修改数据库名,主要是需要修改db.mdf 和db_log.ldf的名字,总算解决了.在这里记下,以后再要修改了就别忘了. 假设原来数据库名为db, ...
- SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)
假设原来数据库名为db,附加数据库为db.mdf和db_log.ldf.需要改成dbt,及dbt.mdf和dbt_log.ldf. 步骤: .首先把原来的数据库进行备份(选择数据库->右键-&g ...
- Oracle的列操作(增加列,修改列,删除列),包括操作多列
增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 modify test varchar2(20); 删除一列: ...
- iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)
iOS UIImageView 根据需求调整frame 1.图片的宽和高不相等,截取图片的中间部分,截取的部分Size明确 2.图片的宽度要等于其父视图的类的宽度,然后根据宽度计算高度,保证 图片不变 ...
- 成员函数的const不能被修改,包括指针
#include <iostream> class A { private: std::string a; public: A(std::string b) :a(b){} const c ...
- c#(winform,webform通用)利用npoi将xls文件复制为xlsx文件(excel的修改,保存,包括excel2003-office2007+的处理)
1.程序界面 每次需要处理excel文件的时候,都是去百度找方案,真是气一头火,今天好好总结一下,下次就不用度娘了. 我是用winform来试验的,因为winform比较方便测试,实际上只要是在.ne ...
- 利用Python读取和修改Excel文件(包括xls文件和xlsx文件)——基于xlrd、xlwt和openpyxl模块
https://blog.csdn.net/sinat_28576553/article/details/81275650#4.4%C2%A0%E4%BF%9D%E5%AD%98%E5%B7%A5%E ...
随机推荐
- ops
consists several key projects separately stand-alone connected entities massive scalability massive ...
- <php>删除(有内容的)文件夹函数程序
function deldir($dirname) { if(!file_exists($dirname)) {//判断文件夹是否存在 die("文件夹不存在!");//作用等于( ...
- 【转】FLV视频封装格式详解
Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV ...
- Android之Intent
前言:大家都知道Android程序的实现一般都由四大组件构成: Activity :Android程序实现功能的主体,提供了和客户交互的界面,也提供了和后台交互的功能. Service :是一个没有界 ...
- CentOS7 定时检测进程占用内存大小,执行重启进程操作(xjl456852原创)
在使用CentOS时,个别程序的进程会一直增大,直到宕机.但是这种程序本身有没有更好的版本使用(比如ngrok免费就这样,付费的就没这个问题),所以想写一个脚本定时检测一下这个程序的情况,决定是否需要 ...
- ORACLE SEQUENCE 介绍
在oracle中sequence就是所谓的序列号,每次取的时候它会自己主动添加,一般用在须要按序列号排序的地方. 1.Create Sequence 你首先要有CREATE SEQUENCE或者C ...
- samba后台进程及安全模式简介
识别 Samba 后台程序Linux 服务器通常作为守护程序(daemon) 来实现,这一词源于希腊神话,其中守护神(daemon)是超自然生物.Linux 守护程序在后台运行以便执行一些有用的任务. ...
- nginx使用keepalived实现高可用
环境: 主:linux-node1 110.0.0.137 备:linux-node2 110.0.0.138 VIP: 110.0.0.120 NGINX安装: # rpm -ivh h ...
- RegexOptions.Compiled性能
原文:http://www.cnblogs.com/me-sa/archive/2010/05/19/Is-RegexOptions-Compiled-a-Killer.html "使用正则 ...
- Django初学笔记1.
1,安装python 和 Django , 参考网上教程(安装python,配置path, 安装django,配置path..) 2,查看django安装版本:cmd-->python--> ...