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下面编译却没有问题。 image

记住一点:右值不能被修改。

你可能感兴趣的:(C++)