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

  1. ORA-01440:要减小精度和标准,则要修改的列必须为空

    修改字段的精度时,提示“ ORA-01440:要减小精度和标准,则要修改的列必须为空 ” 解决方法:将该表中的数据全部删除即可

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

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

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

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

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

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

  5. Oracle的列操作(增加列,修改列,删除列),包括操作多列

    增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 modify test varchar2(20); 删除一列: ...

  6. iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)

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

  7. 成员函数的const不能被修改,包括指针

    #include <iostream> class A { private: std::string a; public: A(std::string b) :a(b){} const c ...

  8. c#(winform,webform通用)利用npoi将xls文件复制为xlsx文件(excel的修改,保存,包括excel2003-office2007+的处理)

    1.程序界面 每次需要处理excel文件的时候,都是去百度找方案,真是气一头火,今天好好总结一下,下次就不用度娘了. 我是用winform来试验的,因为winform比较方便测试,实际上只要是在.ne ...

  9. 利用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 ...

随机推荐

  1. jquery 实现全选反选

    jquery代码 $(function () { $('#inputCheck').click(function () { if ($(this).attr("checked")) ...

  2. 淡淡de馨香---职业尊严

    大学四年时光匆匆而过,仿佛一切都不曾远去,那种熟悉又激动的感觉好似就在昨天,但是.一切都仅仅是一种感觉,在现实面前没有谁能够逆天,在被遗忘的什么时候,曾经是想着无数的梦想与自定义,同样也是在被遗忘的什 ...

  3. c语言结构体数组定义的三种方式

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...

  4. hdu 5012 Dice

    Problem Description There are 2 special dices on the table. On each face of the dice, a distinct num ...

  5. testng跑失败用例重试

    testng 提高用例通过率,失败用例要重新运行一次 步骤: 1.新建一个Retry 类,implements IRetryAnalyzer接口,这个类里面确定重跑次数,以及分析每次失败是否需要重新运 ...

  6. 在Unity中使用Shader

    1.Material 和 Shader 的关系.一个材质包括一个Shader程序.在Shader中设置的属性能够通过Material可视化设置 2.内建Shader,在5.0之后的版本号中大部分旧的S ...

  7. [Redux] Generating Containers with connect() from React Redux (VisibleTodoList)

    Learn how to use the that comes with React Redux instead of the hand-rolled implementation from the ...

  8. 理解SQL SERVER中的分区表(转)

    简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个 ...

  9. AngularJs练习Demo5

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  10. 华为Oj 找出字符串第一个出现一次的字符

    #include <stdio.h> #include <string.h> char firstSingle(char *str) { int hash[255]={0}; ...